Regression Simulations
linear
enhancer

ccle_rnaseq

juvenile

splicing

lss_3m_2r
enhancer

ccle_rnaseq

juvenile

splicing

hier_poly_3m_2r
enhancer

ccle_rnaseq

juvenile

splicing

linear_lss_3m_2r
enhancer

ccle_rnaseq

juvenile

splicing

Classification Simulations
logistic
enhancer

ccle_rnaseq

juvenile

splicing

lss_3m_2r_logistic
enhancer

ccle_rnaseq

juvenile

splicing

hier_poly_3m_2r_logistic
enhancer

ccle_rnaseq

juvenile

splicing

linear_lss_3m_2r_logistic
enhancer

ccle_rnaseq

juvenile

splicing

Robust Simulations
linear
enhancer
Mean Shift = 10

Mean Shift = 25

ccle_rnaseq
Mean Shift = 10

Mean Shift = 25

lss_3m_2r
enhancer
Mean Shift = 10

Mean Shift = 25

ccle_rnaseq
Mean Shift = 10

Mean Shift = 25

hier_poly_3m_2r
enhancer
Mean Shift = 10

Mean Shift = 25

ccle_rnaseq
Mean Shift = 10

Mean Shift = 25

linear_lss_3m_2r
enhancer
Mean Shift = 10

Mean Shift = 25

ccle_rnaseq
Mean Shift = 10

Mean Shift = 25

Correlation Bias Simulations
Main Figures
PVE = 0.1

PVE = 0.4

Number of RF Splits

Entropy Bias Simulations
Main Figures
Average Rank

Number of RF Splits

CCLE Case Study
Summary

Table of Top Genes
|
|
MDI+ (ridge)
|
MDI
|
TreeSHAP
|
MDI-oob
|
MDA
|
|
17-AAG
|
|
1
|
MMP24 (1.03)
|
MMP24 (1.06)
|
MMP24 (1.12)
|
MMP24 (1.28)
|
MMP24 (1.47)
|
|
2
|
NQO1 (2.62)
|
NQO1 (2.72)
|
NQO1 (2.72)
|
NQO1 (9.47)
|
NQO1 (2.38)
|
|
3
|
ENSG00000261602 (2.84)
|
ENSG00000261602 (3.38)
|
ENSG00000261602 (3)
|
PCSK1N (205.19)
|
ENSG00000261602 (2.59)
|
|
4
|
PCSK1N (4.94)
|
PCSK1N (5.69)
|
PCSK1N (6.31)
|
CGNL1 (342.66)
|
PCSK1N (23.03)
|
|
5
|
OGDHL (6.78)
|
SH3BP1 (8.69)
|
SH3BP1 (7.5)
|
CDH6 (368.28)
|
OGDHL (31.69)
|
|
AEW541
|
|
1
|
TXNDC5 (1.12)
|
TXNDC5 (1.31)
|
TXNDC5 (1.81)
|
TXNDC5 (1.34)
|
TXNDC5 (1.22)
|
|
2
|
TNFRSF17 (2.5)
|
ATP8B2 (2.5)
|
ATP8B2 (4.59)
|
TNFRSF17 (3.66)
|
TNFRSF17 (2.72)
|
|
3
|
ATP8B2 (2.75)
|
TNFRSF17 (2.56)
|
TNFRSF17 (4.94)
|
ATP8B2 (122.84)
|
ATP8B2 (3.09)
|
|
4
|
IQGAP2 (5.94)
|
LHFPL2 (10.44)
|
TCEAL4 (5.25)
|
TMEM101 (164.28)
|
LHFPL2 (6)
|
|
5
|
LHFPL2 (7.19)
|
IQGAP2 (16.09)
|
IQGAP2 (7.44)
|
TCEAL4 (188.97)
|
IQGAP2 (12.94)
|
|
AZD0530
|
|
1
|
VTN (1.97)
|
PRSS57 (3.69)
|
VTN (1.78)
|
VTN (2.16)
|
VTN (168.12)
|
|
2
|
PRSS57 (6.28)
|
VTN (3.84)
|
SYTL1 (8.53)
|
ITGB6 (87.03)
|
SLC16A9 (201.25)
|
|
3
|
ITGB6 (7.53)
|
FDFT1 (20.38)
|
ITGB6 (9.62)
|
SYTL1 (163.72)
|
PRSS57 (346.22)
|
|
4
|
SYTL1 (9.19)
|
ITGB6 (22.19)
|
PRSS57 (21.69)
|
STXBP1 (487.53)
|
SYTL1 (352.44)
|
|
5
|
THEM4 (10.59)
|
SYTL1 (26.56)
|
CLDN16 (36.88)
|
CLDN16 (501.41)
|
TRDC (408.47)
|
|
AZD6244
|
|
1
|
SPRY2 (1.59)
|
RNF125 (2.47)
|
ETV4 (3.16)
|
LYZ (2.88)
|
SPRY2 (2.59)
|
|
2
|
LYZ (2.97)
|
LYZ (2.91)
|
SPRY2 (3.5)
|
RNF125 (3)
|
RNF125 (3.25)
|
|
3
|
RNF125 (3.19)
|
ENSG00000257764 (4.19)
|
RNF125 (3.72)
|
SPRY2 (3.97)
|
LYZ (4.31)
|
|
4
|
ENSG00000257764 (4.03)
|
SPRY2 (4.34)
|
TOR4A (4.72)
|
GJB1 (5)
|
ETV4 (5.5)
|
|
5
|
ETV4 (4.97)
|
GJB1 (5.06)
|
KLF3 (5.84)
|
ENSG00000257764 (6.5)
|
GJB1 (5.72)
|
|
Erlotinib
|
|
1
|
SYTL1 (2)
|
CDH3-AS1 (2)
|
SYTL1 (1.53)
|
CDH3 (1.97)
|
SYTL1 (2.53)
|
|
2
|
CDH3 (2.06)
|
CDH3 (2.06)
|
CDH3 (2.34)
|
SYTL1 (2.12)
|
CDH3 (2.81)
|
|
3
|
CDH3-AS1 (2.22)
|
SYTL1 (3.09)
|
CDH3-AS1 (2.94)
|
CDH3-AS1 (2.66)
|
CDH3-AS1 (3.19)
|
|
4
|
EGFR (5.78)
|
EGFR (5.72)
|
GJB3 (6.19)
|
GJB3 (17.25)
|
GJB3 (8.09)
|
|
5
|
GJB3 (6.81)
|
GJB3 (11.62)
|
EGFR (13.75)
|
EGFR (20.75)
|
EGFR (17.44)
|
|
Irinotecan
|
|
1
|
SLFN11 (1)
|
SLFN11 (1.28)
|
SLFN11 (1)
|
SLFN11 (1.19)
|
SLFN11 (1)
|
|
2
|
PPIC (2.44)
|
PPIC (2.41)
|
PPIC (2.75)
|
PPIC (2.69)
|
PPIC (2.62)
|
|
3
|
PPIC-AS1 (3.31)
|
PPIC-AS1 (3.25)
|
S100A16 (3.16)
|
PPIC-AS1 (3.09)
|
S100A16 (3.28)
|
|
4
|
S100A16 (3.69)
|
S100A16 (3.28)
|
PPIC-AS1 (3.41)
|
S100A16 (3.38)
|
PPIC-AS1 (3.28)
|
|
5
|
AGAP2 (5.44)
|
AGAP2 (6.97)
|
AGAP2 (6.47)
|
AGAP2 (7.66)
|
AGAP2 (9.56)
|
|
L-685458
|
|
1
|
DEF6 (2)
|
DEF6 (2.12)
|
DEF6 (2.28)
|
DEF6 (1.84)
|
ENSG00000257824 (5.31)
|
|
2
|
ENSG00000257824 (5.44)
|
ENSG00000257824 (6.47)
|
ENSG00000257824 (6.22)
|
ENSG00000257824 (6.69)
|
DEF6 (6.44)
|
|
3
|
PPIC-AS1 (9.38)
|
PPIC-AS1 (21.34)
|
PPIC-AS1 (14.66)
|
RASAL3 (24.16)
|
PPIC-AS1 (17.78)
|
|
4
|
RASAL3 (11.12)
|
P2RX1 (48.66)
|
CTNNA1 (43.38)
|
LAIR1 (59.62)
|
CTNNA1 (30.12)
|
|
5
|
P2RX1 (16.88)
|
RASAL3 (53.22)
|
RASAL3 (46.5)
|
IKZF1 (90.12)
|
LAIR1 (79.47)
|
|
LBW242
|
|
1
|
IGSF3 (1.09)
|
IGSF3 (1.78)
|
IGSF3 (3.53)
|
SERPINB6 (170.56)
|
IGSF3 (1.84)
|
|
2
|
HERC5 (3.81)
|
SH3RF1 (5.06)
|
SERPINB6 (5.12)
|
PINLYP (188.59)
|
IL1R2 (9.59)
|
|
3
|
GBP1 (4.78)
|
GBP1 (5.16)
|
HERC5 (5.94)
|
RGS14 (219.16)
|
SERPINB6 (14.28)
|
|
4
|
CXCL1 (5.22)
|
RGS14 (8.22)
|
CXCL1 (8.22)
|
GBP1 (323.72)
|
GBP1 (169.19)
|
|
5
|
IL1R2 (5.97)
|
IL1R2 (8.56)
|
GBP1 (9.34)
|
IGSF3 (341.22)
|
CD96 (291.59)
|
|
Lapatinib
|
|
1
|
ERBB2 (1.22)
|
ERBB2 (1.38)
|
ERBB2 (1.41)
|
ERBB2 (1.34)
|
ERBB2 (1.88)
|
|
2
|
PGAP3 (1.97)
|
PGAP3 (1.91)
|
PGAP3 (5.31)
|
PGAP3 (2.62)
|
PGAP3 (1.91)
|
|
3
|
GRB7 (3.06)
|
GRB7 (3.31)
|
ENSG00000152022 (5.47)
|
GRB7 (4)
|
GRB7 (4.06)
|
|
4
|
ENSG00000152022 (4.62)
|
ENSG00000152022 (4.78)
|
FAM83H (6.53)
|
ENSG00000152022 (5.09)
|
ENSG00000152022 (5.16)
|
|
5
|
EPHA1 (7.66)
|
IKBIP (9)
|
EPHA1 (7.78)
|
FAM83H (8.91)
|
EPHA1 (10.44)
|
|
Nilotinib
|
|
1
|
TRDC (1.56)
|
TRDC (1.94)
|
TRDC (2.56)
|
PRSS57 (2)
|
TRDC (1.56)
|
|
2
|
PRSS57 (2.41)
|
CISH (2.62)
|
PRSS57 (2.69)
|
TRDC (3.97)
|
PRSS57 (2.5)
|
|
3
|
CISH (2.94)
|
PRSS57 (2.81)
|
CISH (3.56)
|
NRROS (6.47)
|
CISH (3.44)
|
|
4
|
SPN (5.84)
|
SPN (6.53)
|
NRROS (7.78)
|
SPN (14.25)
|
NRROS (10.56)
|
|
5
|
NRROS (6.09)
|
NRROS (11.09)
|
SPN (8.25)
|
KLF13 (15.94)
|
SOCS2 (15.09)
|
|
Nutlin-3
|
|
1
|
ITGAL (3.91)
|
ENSG00000255518 (3.22)
|
MDM2 (1.22)
|
MDM2 (6.09)
|
ENSG00000255518 (6.34)
|
|
2
|
ENSG00000255518 (4)
|
ITGAL (4.25)
|
RPS27L (9.25)
|
ADD3 (49.31)
|
ITGAL (9.06)
|
|
3
|
MDM2 (5.31)
|
ENSG00000261346 (5)
|
DDB2 (10)
|
DDB2 (94.78)
|
ENSG00000261346 (12.12)
|
|
4
|
ENSG00000261346 (5.47)
|
MDM2 (10.22)
|
ITGAL (12.31)
|
ENSG00000261346 (166.88)
|
ENSG00000261332 (48.56)
|
|
5
|
C16orf54 (9.12)
|
ENSG00000261332 (18.41)
|
ENSG00000255518 (14.44)
|
ITGAL (168.94)
|
CERKL (95.75)
|
|
PD-0325901
|
|
1
|
ETV4 (1.03)
|
ETV4 (1.56)
|
ETV4 (1)
|
ETV4 (1.06)
|
ETV4 (1.06)
|
|
2
|
SPRY2 (2.31)
|
GJB1 (3.19)
|
SPRY2 (4.16)
|
GJB1 (4.16)
|
SPRY2 (3.19)
|
|
3
|
GJB1 (4.62)
|
SPRY2 (4.97)
|
TOR4A (4.41)
|
SPRY2 (5.03)
|
TOR4A (5.41)
|
|
4
|
RNF125 (4.94)
|
RNF125 (5.66)
|
KLF3 (5.62)
|
ENSG00000257764 (6.34)
|
GJB1 (5.44)
|
|
5
|
ENSG00000257764 (5.81)
|
ENSG00000257764 (6.47)
|
GJB1 (5.97)
|
KLF3 (7.38)
|
KLF3 (6.94)
|
|
PD-0332991
|
|
1
|
PPIC-AS1 (2.19)
|
PPIC-AS1 (2.78)
|
PPIC-AS1 (2.19)
|
PPIC-AS1 (2.56)
|
PPIC-AS1 (1.75)
|
|
2
|
ENSG00000234648 (2.53)
|
ENSG00000234648 (2.94)
|
ENSG00000234648 (2.62)
|
ENSG00000234648 (2.94)
|
ENSG00000234648 (2.41)
|
|
3
|
PPIC (4.16)
|
SH2D3C (5.06)
|
PPIC (4.22)
|
PPIC (4.12)
|
PPIC (3.16)
|
|
4
|
SH2D3C (4.78)
|
PPIC (5.28)
|
SH2D3C (6.94)
|
SH2D3C (5.16)
|
SH2D3C (6.97)
|
|
5
|
AGAP2 (11.25)
|
TRAF3IP3 (12.03)
|
AGAP2 (11.34)
|
TRAF3IP3 (11.22)
|
AGAP2 (30.38)
|
|
PF2341066
|
|
1
|
ENAH (1.09)
|
ENAH (1.72)
|
ENAH (1)
|
ENAH (1.12)
|
ENAH (1.06)
|
|
2
|
SELPLG (2.16)
|
SELPLG (2)
|
SELPLG (2.25)
|
SELPLG (2.12)
|
SELPLG (2.16)
|
|
3
|
MET (2.94)
|
MET (2.38)
|
HGF (3.22)
|
MET (4.03)
|
MET (2.97)
|
|
4
|
HGF (4.38)
|
HGF (5.78)
|
MET (4.19)
|
DOK2 (4.56)
|
HGF (6.03)
|
|
5
|
DOK2 (5.44)
|
DOK2 (6.19)
|
DOK2 (5.97)
|
HGF (6.47)
|
DOK2 (6.44)
|
|
PHA-665752
|
|
1
|
ARHGAP4 (1)
|
ARHGAP4 (1)
|
ARHGAP4 (1)
|
ARHGAP4 (1)
|
ARHGAP4 (1.03)
|
|
2
|
FMNL1-AS1 (2.75)
|
FMNL1-AS1 (3.44)
|
FMNL1-AS1 (2.41)
|
FMNL1-AS1 (2.56)
|
FMNL1-AS1 (2.84)
|
|
3
|
FMNL1 (3.69)
|
FMNL1 (5.75)
|
FMNL1 (3.12)
|
FMNL1 (4.81)
|
FMNL1 (4.62)
|
|
4
|
PGPEP1 (5.75)
|
PGPEP1 (7.91)
|
PGPEP1 (5.81)
|
PGPEP1 (6.91)
|
ACAP1 (9.34)
|
|
5
|
HEY1 (13.88)
|
FDFT1 (12.09)
|
HEY1 (18.69)
|
HEY1 (27.72)
|
HEY1 (13.09)
|
|
PLX4720
|
|
1
|
RXRG (1.34)
|
RXRG (1.78)
|
MMP8 (2.34)
|
RXRG (2.16)
|
RXRG (2.03)
|
|
2
|
MMP8 (3.09)
|
MMP8 (3.25)
|
RXRG (2.59)
|
MMP8 (2.69)
|
MMP8 (2.62)
|
|
3
|
ENSG00000227297 (4.5)
|
LYST (3.75)
|
LYST (3.88)
|
LYST (5.44)
|
LYST (5.03)
|
|
4
|
LYST (5.09)
|
ENSG00000256673 (7.16)
|
ENSG00000256673 (7.41)
|
ENSG00000256673 (6.84)
|
PLP1 (6.75)
|
|
5
|
ENSG00000256673 (6.59)
|
PLP1 (8.72)
|
PLP1 (9.38)
|
UCN2 (9.62)
|
UCN2 (8.38)
|
|
Paclitaxel
|
|
1
|
MMP24 (1.19)
|
MMP24 (1.25)
|
MMP24 (1.09)
|
MMP24 (1.41)
|
MMP24 (1.31)
|
|
2
|
AGAP2 (1.88)
|
AGAP2 (1.78)
|
AGAP2 (2.06)
|
AGAP2 (2.47)
|
AGAP2 (2.34)
|
|
3
|
BCL2L1 (3.31)
|
BCL2L1 (4.47)
|
BCL2L1 (3.72)
|
SH3BP1 (13.28)
|
PTPN7 (4.38)
|
|
4
|
ABCB1 (5.12)
|
PTPN7 (7.72)
|
P3H3 (5.81)
|
POLR3G (33.34)
|
BCL2L1 (4.88)
|
|
5
|
SH3BP1 (7.28)
|
P3H3 (8.22)
|
SH3BP1 (6.94)
|
BCL2L1 (71.31)
|
P3H3 (6.47)
|
|
Panobinostat
|
|
1
|
AGAP2 (1.12)
|
AGAP2 (1.31)
|
AGAP2 (1.31)
|
AGAP2 (1.5)
|
AGAP2 (1.34)
|
|
2
|
CCN1 (1.91)
|
CCN1 (1.72)
|
CCN1 (1.69)
|
CCN1 (1.84)
|
CCN1 (1.84)
|
|
3
|
MYOF (4.44)
|
RPL39P5 (4.47)
|
MYOF (4.31)
|
WWTR1 (7.09)
|
RPL39P5 (4.44)
|
|
4
|
RPL39P5 (4.69)
|
WWTR1 (4.78)
|
RPL39P5 (5.28)
|
MYOF (14.97)
|
WWTR1 (5.34)
|
|
5
|
WWTR1 (4.97)
|
AMOTL2 (6.16)
|
WWTR1 (5.69)
|
FTH1P23 (72.56)
|
MYOF (6.28)
|
|
RAF265
|
|
1
|
SYT17 (1.88)
|
SYT17 (2.5)
|
SYT17 (1.34)
|
SYT17 (4.69)
|
SYT17 (3.34)
|
|
2
|
EMILIN2 (3.19)
|
EMILIN2 (5.75)
|
SH2B3 (6.41)
|
SH2B3 (58.62)
|
STAT5A (8.53)
|
|
3
|
STAT5A (6.22)
|
STAT5A (6.59)
|
SLC29A3 (7.66)
|
STAT5A (69.56)
|
SH2B3 (12.81)
|
|
4
|
SH2B3 (6.56)
|
SLC29A3 (12.06)
|
EMILIN2 (8.16)
|
CMTM3 (76.38)
|
SLC29A3 (22.34)
|
|
5
|
RGS10 (8.47)
|
SH2B3 (12.16)
|
STAT5A (8.97)
|
EMILIN2 (310.97)
|
EMILIN2 (23.06)
|
|
Sorafenib
|
|
1
|
SPNS3 (1.53)
|
SPNS3 (2.28)
|
TP63 (1.81)
|
SPNS3 (2.25)
|
SPNS3 (1.62)
|
|
2
|
LAIR1 (9.78)
|
ENSG00000273055 (13.78)
|
SPNS3 (4.62)
|
TP63 (19.12)
|
ENSG00000273055 (17.38)
|
|
3
|
ENSG00000273055 (11.59)
|
TP63 (25.81)
|
ENSG00000273055 (13.22)
|
SELPLG (32.88)
|
TP63 (25.69)
|
|
4
|
P2RX1 (13.66)
|
P2RX1 (27.41)
|
FAM117A (20.84)
|
FAM117A (37.03)
|
FAM117A (38.88)
|
|
5
|
TWF1 (13.81)
|
TWF1 (33.34)
|
P2RX1 (26.38)
|
TWF1 (37.56)
|
SELPLG (38.97)
|
|
TAE684
|
|
1
|
SELPLG (1)
|
SELPLG (1)
|
SELPLG (1)
|
SELPLG (1)
|
SELPLG (1)
|
|
2
|
LAIR1 (4.44)
|
NFIL3 (4.28)
|
ARID3A (5.75)
|
LAIR1 (6.19)
|
LAIR1 (5.97)
|
|
3
|
NFIL3 (4.69)
|
FMNL1-AS1 (6.12)
|
LAIR1 (7.97)
|
FMNL1-AS1 (10.66)
|
NFIL3 (6.09)
|
|
4
|
ARID3A (4.91)
|
LAIR1 (6.41)
|
FMNL1-AS1 (8.41)
|
CPXM1 (11.66)
|
CPXM1 (7.41)
|
|
5
|
FMNL1-AS1 (6.16)
|
PRDM1 (9.69)
|
CPXM1 (10.41)
|
ARID3A (13.84)
|
FMNL1-AS1 (8.59)
|
|
TKI258
|
|
1
|
TWF1 (1.03)
|
TWF1 (1.19)
|
TWF1 (1.09)
|
TWF1 (1.03)
|
TWF1 (1.03)
|
|
2
|
PRSS57 (4.72)
|
PRSS57 (7.03)
|
GPR162 (11.19)
|
GPR162 (72.91)
|
LAT2 (7.88)
|
|
3
|
LAT2 (7.88)
|
LAT2 (8.03)
|
P3H3 (12.34)
|
P3H3 (89.69)
|
PRSS57 (16.44)
|
|
4
|
C16orf54 (12.09)
|
C16orf54 (17.56)
|
PRSS57 (27.19)
|
CFL2 (125.95)
|
CFL2 (112.3)
|
|
5
|
GPX7 (16.56)
|
GPX7 (26.34)
|
LAT2 (28.59)
|
PCDH1 (179.09)
|
SPN (114.22)
|
|
Topotecan
|
|
1
|
SLFN11 (1)
|
SLFN11 (1)
|
SLFN11 (1)
|
SLFN11 (1)
|
SLFN11 (1)
|
|
2
|
PPIC (2.31)
|
PPIC (2.44)
|
PPIC (2.75)
|
PPIC (2.66)
|
PPIC (2.47)
|
|
3
|
PPIC-AS1 (3.19)
|
PPIC-AS1 (3.44)
|
S100A16 (3.81)
|
PPIC-AS1 (3.28)
|
PPIC-AS1 (3.28)
|
|
4
|
S100A16 (5.03)
|
S100A16 (4.16)
|
PPIC-AS1 (3.81)
|
S100A16 (4.06)
|
S100A16 (4.34)
|
|
5
|
HMGB2 (6.25)
|
OSGIN1 (6.41)
|
OSGIN1 (5.81)
|
OSGIN1 (7.31)
|
RASAL3 (6.06)
|
|
ZD-6474
|
|
1
|
DYNLT3 (4.12)
|
MAP3K12 (6.72)
|
MAP3K12 (4.5)
|
MAP3K12 (9.47)
|
DYNLT3 (12.31)
|
|
2
|
MAP3K12 (4.75)
|
CTSH (13.56)
|
DYNLT3 (5.31)
|
DYNLT3 (23.91)
|
TIMP1 (17.69)
|
|
3
|
PIM1 (8.47)
|
DYNLT3 (14.28)
|
TIMP1 (9.25)
|
TIMP1 (172.03)
|
MAP3K12 (20.19)
|
|
4
|
CTSH (11)
|
PIM1 (15.19)
|
SCD5 (14.66)
|
DLG4 (232)
|
DLG4 (25.38)
|
|
5
|
DLG4 (12.72)
|
DLG4 (15.66)
|
CTSH (15.38)
|
ITGA10 (258.05)
|
CTSH (27.25)
|
17-AAG

AEW541

AZD0530

AZD6244

Erlotinib

Irinotecan

L-685458

LBW242

Lapatinib

Nilotinib

Nutlin-3

PD-0325901

PD-0332991

PF2341066

PHA-665752

PLX4720

Paclitaxel

Panobinostat

RAF265

Sorafenib

TAE684

TKI258

Topotecan

ZD-6474

TCGA BRCA Case Study
Non-zero Stability Scores Per Method

Stability of Top Features

Table of Top Genes
|
Rank
|
MDI+ (ridge)
|
MDI+ (logistic)
|
MDA
|
TreeSHAP
|
MDI
|
|
1
|
ESR1 (1.66)
|
ESR1 (1.78)
|
ESR1 (4.56)
|
ESR1 (6.56)
|
TPX2 (12.31)
|
|
2
|
FOXA1 (3.34)
|
GATA3 (4.84)
|
FOXA1 (5.62)
|
TPX2 (7.97)
|
ESR1 (14.38)
|
|
3
|
FOXC1 (4.44)
|
TPX2 (5.03)
|
GATA3 (5.69)
|
FOXA1 (15.22)
|
FOXA1 (21.94)
|
|
4
|
GATA3 (6.12)
|
FOXA1 (5.88)
|
MLPH (6.19)
|
GATA3 (16.31)
|
FOXM1 (24.22)
|
|
5
|
AGR3 (7.19)
|
FOXC1 (8.09)
|
TPX2 (7.47)
|
FOXM1 (16.88)
|
GATA3 (24.66)
|
|
6
|
MLPH (8.22)
|
MLPH (10.91)
|
FOXM1 (13.55)
|
MLPH (19.16)
|
MLPH (26.75)
|
|
7
|
TPX2 (8.59)
|
AGR3 (10.94)
|
AGR3 (13.78)
|
CDK1 (21.75)
|
CDK1 (28.84)
|
|
8
|
FOXM1 (19.41)
|
FOXM1 (11.12)
|
FOXC1 (14.62)
|
AGR3 (24.06)
|
FOXC1 (31.41)
|
|
9
|
TBC1D9 (20.44)
|
UBE2C (14.47)
|
TBC1D9 (16.47)
|
MYBL2 (24.22)
|
TBC1D9 (31.72)
|
|
10
|
SFRP1 (21.28)
|
MYBL2 (20.47)
|
KIF2C (22.41)
|
FOXC1 (26.66)
|
AGR3 (31.91)
|
Misspecified Models
linear
enhancer

ccle_rnaseq

juvenile

splicing

lss_3m_2r
enhancer

ccle_rnaseq

juvenile

splicing

hier_poly_3m_2r
enhancer

ccle_rnaseq

juvenile

splicing

linear_lss_3m_2r
enhancer

ccle_rnaseq

juvenile

splicing

Varying Sparsity
linear
juvenile

splicing

lss_3m_2r
juvenile

splicing

hier_poly_3m_2r
juvenile

splicing

linear_lss_3m_2r
juvenile

splicing

Varying # Features
linear
ccle_rnaseq

lss_3m_2r
ccle_rnaseq

hier_poly_3m_2r
ccle_rnaseq

linear_lss_3m_2r
ccle_rnaseq

Prediction Results

MDI+ Add-ons
linear
enhancer
min_samples_per_leaf = 5

min_samples_per_leaf = 1

ccle_rnaseq
min_samples_per_leaf = 5

min_samples_per_leaf = 1

hier_poly_3m_2r
enhancer
min_samples_per_leaf = 5

min_samples_per_leaf = 1

ccle_rnaseq
min_samples_per_leaf = 5

min_samples_per_leaf = 1

MDI+ GLM/Metric Choices
Held-out Test Prediction Scores
linear
enhancer

ccle_rnaseq

hier_poly_3m_2r
enhancer

ccle_rnaseq

Stability Scores
linear
enhancer


ccle_rnaseq


hier_poly_3m_2r
enhancer


ccle_rnaseq


Stability Scores - Classification
logistic
juvenile


splicing


hier_poly_3m_2r_logistic
juvenile


splicing


LS0tCnRpdGxlOiAiTURJKyBTaW11bGF0aW9uIFJlc3VsdHMgU3VtbWFyeSIKYXV0aG9yOiAiIgpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclQiAlZCwgJVknKWAiCm91dHB1dDogdnRoZW1lczo6dm1vZGVybgpwYXJhbXM6CiAgcmVzdWx0c19kaXI6IAogICAgbGFiZWw6ICJSZXN1bHRzIGRpcmVjdG9yeSIKICAgIHZhbHVlOiAiL2dsb2JhbC9zY3JhdGNoL3VzZXJzL3RpZmZhbnl0YW5nL2ZlYXR1cmVfaW1wb3J0YW5jZS9yZXN1bHRzX2ZpbmFsLyIKICBzZWVkOgogICAgbGFiZWw6ICJTZWVkIgogICAgdmFsdWU6IDEyMzQ1CiAgZm9yX3BhcGVyOgogICAgbGFiZWw6ICJFeHBvcnQgcGxvdHMgZm9yIHBhcGVyIgogICAgdmFsdWU6IEZBTFNFCiAgdXNlX2NhY2hlZDoKICAgIGxhYmVsOiAiVXNlIGNhY2hlZCAucmRzIGZpbGVzIgogICAgdmFsdWU6IFRSVUUKICBpbnRlcmFjdGl2ZToKICAgIGxhYmVsOiAiSW50ZXJhY3RpdmUgcGxvdHMiCiAgICB2YWx1ZTogRkFMU0UKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpCgpsaWJyYXJ5KG1hZ3JpdHRyKQpsaWJyYXJ5KHBhdGNod29yaykKY2h1bmtfaWR4IDwtIDEKCiMgc2V0IHBhcmFtZXRlcnMKcmVzdWx0c19kaXIgPC0gcGFyYW1zJHJlc3VsdHNfZGlyCnNlZWQgPC0gcGFyYW1zJHNlZWQKZmlndXJlc19kaXIgPC0gZmlsZS5wYXRoKCJmaWd1cmVzIikKZmlndXJlc19zdWJkaXJzIDwtIGMoInJlZ3Jlc3Npb25fc2ltcyIsICJjbGFzc2lmaWNhdGlvbl9zaW1zIiwgInJvYnVzdF9zaW1zIiwKICAgICAgICAgICAgICAgICAgICAgIm1pc3NwZWNpZmllZF9yZWdyZXNzaW9uX3NpbXMiLCAidmFyeWluZ19zcGFyc2l0eSIsICJ2YXJ5aW5nX3AiLAogICAgICAgICAgICAgICAgICAgICAibW9kZWxpbmdfY2hvaWNlcyIsICJnbG1fbWV0cmljX2Nob2ljZXMiKQpmb3IgKGZpZ3VyZXNfc3ViZGlyIGluIGZpZ3VyZXNfc3ViZGlycykgewogIGlmICghZGlyLmV4aXN0cyhmaWxlLnBhdGgoZmlndXJlc19kaXIsIGZpZ3VyZXNfc3ViZGlyKSkpIHsKICAgIGRpci5jcmVhdGUoZmlsZS5wYXRoKGZpZ3VyZXNfZGlyLCBmaWd1cmVzX3N1YmRpciksIHJlY3Vyc2l2ZSA9IFRSVUUpCiAgfQp9CgojIG1pc2NlbGxhbmVvdXMgaGVscGVyIHZhcmlhYmxlcwpoZXJpdGFiaWxpdGllcyA8LSBjKDAuMSwgMC4yLCAwLjQsIDAuOCkKZnJhY19sYWJlbF9jb3JydXB0aW9ucyA8LSBjKCIwLjI1IiwgIjAuMTUiLCAiMC4wNSIsICIwIikKY29ycnVwdF9zaXplcyA8LSBjKDAuMDUsIDAuMDI1LCAwLjAxLCAwKQptZWFuX3NoaWZ0cyA8LSBjKDEwLCAyNSkKbWV0cmljIDwtICJyb2NhdWMiCgojIHBsb3Qgb3B0aW9ucwpwb2ludF9zaXplIDwtIDIKbGluZV9zaXplIDwtIDEKZXJyYmFyX3dpZHRoIDwtIDAKaWYgKHBhcmFtcyRpbnRlcmFjdGl2ZSkgewogIHBsb3RfZnVuIDwtIHBsb3RseTo6Z2dwbG90bHkKfSBlbHNlIHsKICBwbG90X2Z1biA8LSBmdW5jdGlvbih4KSB4Cn0KCm1hbnVhbF9jb2xvcl9wYWxldHRlX2Nob2ljZXMgPC0gYygKICAiYmxhY2siLCAiYmxhY2siLCAiIzlCNURGRiIsICJibHVlIiwKICAib3JhbmdlIiwgIiM3MWJlYjciLCAiIzIxOGExZSIsICIjY2MzMzk5IgopCnNob3dfbWV0aG9kc19jaG9pY2VzIDwtIGMoCiAgIkdNRElfcmlkZ2VfUkYiLCAiR01ESV9yaWRnZV9sb29fcjJfUkYiLCAiR01ESV9sb2dpc3RpY19sb2dsb3NzX1JGIiwgIkdNRElfSHViZXJfbG9vX2h1YmVyX2xvc3NfUkYiLAogICJNREFfUkYiLCAiTURJX1JGIiwgIk1ESS1vb2JfUkYiLCAiVHJlZVNIQVBfUkYiCikKbWV0aG9kX2xhYmVsc19jaG9pY2VzIDwtIGMoCiAgIk1ESSsgKHJpZGdlKSIsICJNREkrIChyaWRnZSkiLCAiTURJKyAobG9naXN0aWMpIiwgIk1ESSsgKEh1YmVyKSIsCiAgIk1EQSIsICJNREkiLCAiTURJLW9vYiIsICJUcmVlU0hBUCIKKQpjb2xvcl9kZiA8LSB0aWJibGU6OnRpYmJsZSgKICBjb2xvciA9IG1hbnVhbF9jb2xvcl9wYWxldHRlX2Nob2ljZXMsCiAgbmFtZSA9IHNob3dfbWV0aG9kc19jaG9pY2VzLAogIGxhYmVsID0gbWV0aG9kX2xhYmVsc19jaG9pY2VzCikKCm1hbnVhbF9jb2xvcl9wYWxldHRlX2FsbCA8LSBOVUxMCnNob3dfbWV0aG9kc19hbGwgPC0gTlVMTAptZXRob2RfbGFiZWxzX2FsbCA8LSBnZ3Bsb3QyOjp3YWl2ZXIoKQoKY3VzdG9tX3RoZW1lIDwtIHZ0aGVtZXM6OnRoZW1lX3Ztb2Rlcm4oCiAgc2l6ZV9wcmVzZXQgPSAibWVkaXVtIiwgYmdfY29sb3IgPSAid2hpdGUiLCBncmlkX2NvbG9yID0gIndoaXRlIiwKICBheGlzLnRpY2tzID0gZ2dwbG90Mjo6ZWxlbWVudF9saW5lKHNpemUgPSBnZ3Bsb3QyOjpyZWwoMiksIGNvbG91ciA9ICJibGFjayIpLAogIGF4aXMudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogIGF4aXMudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBmYWNlID0gInBsYWluIiksCiAgbGVnZW5kLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpCiAgIyBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJwbGFpbiIsIGhqdXN0ID0gMC41KQopCmN1c3RvbV90aGVtZV93aXRoX2xlZ2VuZCA8LSB2dGhlbWVzOjp0aGVtZV92bW9kZXJuKAogIHNpemVfcHJlc2V0ID0gIm1lZGl1bSIsIGJnX2NvbG9yID0gIndoaXRlIiwgZ3JpZF9jb2xvciA9ICJ3aGl0ZSIsCiAgYXhpcy50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAicGxhaW4iKSwKICBsZWdlbmQudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gOSksCiAgbGVnZW5kLnRleHQuYWxpZ24gPSAwLAogIHBsb3QudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkKKQpjdXN0b21fdGhlbWVfd2l0aG91dF9sZWdlbmQgPC0gdnRoZW1lczo6dGhlbWVfdm1vZGVybigKICBzaXplX3ByZXNldCA9ICJtZWRpdW0iLCBiZ19jb2xvciA9ICJ3aGl0ZSIsIGdyaWRfY29sb3IgPSAid2hpdGUiLAogIGF4aXMudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gInBsYWluIiksCiAgbGVnZW5kLnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpLAogIGxlZ2VuZC50ZXh0ID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSA5KSwKICBsZWdlbmQudGV4dC5hbGlnbiA9IDAsCiAgcGxvdC50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKQopCgpmaWdfaGVpZ2h0IDwtIDYKZmlnX3dpZHRoIDwtIDEwCgpzb3VyY2UoIi4uLy4uL3NjcmlwdHMvdml6LlIiLCBjaGRpciA9IFRSVUUpCmBgYAoKCiMgUmVncmVzc2lvbiBTaW11bGF0aW9ucyB7LnRhYnNldCAudGFic2V0LXZtb2Rlcm59CgpgYGB7ciBldmFsID0gVFJVRSwgcmVzdWx0cyA9ICJhc2lzIn0Ka2VlcF9tZXRob2RzIDwtIGNvbG9yX2RmJG5hbWUgJWluJSBjKCJHTURJX3JpZGdlX1JGIiwgIk1EQV9SRiIsICJNRElfUkYiLCAiTURJLW9vYl9SRiIsICJUcmVlU0hBUF9SRiIpCm1hbnVhbF9jb2xvcl9wYWxldHRlIDwtIGNvbG9yX2RmJGNvbG9yW2tlZXBfbWV0aG9kc10Kc2hvd19tZXRob2RzIDwtIGNvbG9yX2RmJG5hbWVba2VlcF9tZXRob2RzXQptZXRob2RfbGFiZWxzIDwtIGNvbG9yX2RmJGxhYmVsW2tlZXBfbWV0aG9kc10KYWxwaGFfdmFsdWVzIDwtIGMoMSwgcmVwKDAuNCwgbGVuZ3RoKG1ldGhvZF9sYWJlbHMpIC0gMSkpCmxlZ2VuZF9wb3NpdGlvbiA8LSBjKDAuNzMsIDAuMzUpCgp2YXJ5X3BhcmFtX25hbWUgPC0gImhlcml0YWJpbGl0eV9zYW1wbGVfcm93X24iCnlfbW9kZWxzIDwtIGMoImxpbmVhciIsICJsc3NfM21fMnIiLCAiaGllcl9wb2x5XzNtXzJyIiwgImxpbmVhcl9sc3NfM21fMnIiKQp4X21vZGVscyA8LSBjKCJlbmhhbmNlciIsICJjY2xlX3JuYXNlcSIsICJqdXZlbmlsZSIsICJzcGxpY2luZyIpCgpyZW1vdmVfeF9heGlzX21vZGVscyA8LSBjKCJzcGxpY2luZyIsICJlbmhhbmNlciIpCmtlZXBfbGVnZW5kX3hfbW9kZWxzIDwtIGMoInNwbGljaW5nIiwgImVuaGFuY2VyIikKa2VlcF9sZWdlbmRfeV9tb2RlbHMgPC0gYygibGluZWFyIiwgImxpbmVhcl9sc3NfM21fMnIiKQoKZm9yICh5X21vZGVsIGluIHlfbW9kZWxzKSB7CiAgY2F0KHNwcmludGYoIlxuXG4jIyAlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtc3F1YXJlfVxuXG4iLCB5X21vZGVsKSkKICBmb3IgKHhfbW9kZWwgaW4geF9tb2RlbHMpIHsKICAgIGNhdChzcHJpbnRmKCJcblxuIyMjICVzIFxuXG4iLCB4X21vZGVsKSkKICAgIHBsdF9scyA8LSBsaXN0KCkKICAgIHNpbV9uYW1lIDwtIHNwcmludGYoIiVzXyVzX2RncCIsIHhfbW9kZWwsIHlfbW9kZWwpCiAgICBzaW1fdGl0bGUgPC0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgeF9tb2RlbCA9PSAiY2NsZV9ybmFzZXEiIH4gIkNDTEUiLAogICAgICB4X21vZGVsID09ICJzcGxpY2luZyIgfiAiU3BsaWNpbmciLAogICAgICB4X21vZGVsID09ICJlbmhhbmNlciIgfiAiRW5oYW5jZXIiLAogICAgICB4X21vZGVsID09ICJqdXZlbmlsZSIgfiAiSnV2ZW5pbGUiCiAgICApCiAgICBtZXRyaWNfbmFtZSA8LSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICBtZXRyaWMgPT0gInJvY2F1YyIgfiAiQVVST0MiLAogICAgICBtZXRyaWMgPT0gInByYXVjIiB+ICJQUkFVQyIKICAgICkKICAgIGZuYW1lIDwtIGZpbGUucGF0aChyZXN1bHRzX2RpciwgcGFzdGUwKCJnbWRpLnJlZ3Jlc3Npb25fc2ltcy4iLCBzaW1fbmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJ2YXJ5aW5nXyIsIHZhcnlfcGFyYW1fbmFtZSksIAogICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgic2VlZCIsIHNlZWQpLCAicmVzdWx0cyIpCiAgICBpZiAoZmlsZS5leGlzdHMoc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKSAmIHBhcmFtcyR1c2VfY2FjaGVkKSB7CiAgICAgIHJlc3VsdHMgPC0gcmVhZFJEUyhzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgIGlmIChsZW5ndGgoc2V0ZGlmZihzaG93X21ldGhvZHMsIHVuaXF1ZShyZXN1bHRzJG1ldGhvZCkpKSA+IDApIHsKICAgICAgICByZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKHNwcmludGYoIiVzLmNzdiIsIGZuYW1lKSkgJT4lCiAgICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgICBzYXZlUkRTKHJlc3VsdHMsIHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChzcHJpbnRmKCIlcy5jc3YiLCBmbmFtZSkpICU+JQogICAgICAgIHJlZm9ybWF0X3Jlc3VsdHMoKQogICAgICBzYXZlUkRTKHJlc3VsdHMsIHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgIH0KICAgIGlmIChwYXJhbXMkZm9yX3BhcGVyKSB7CiAgICAgIGZvciAoaCBpbiBoZXJpdGFiaWxpdGllcykgewogICAgICAgIHBsdCA8LSByZXN1bHRzICU+JQogICAgICAgICAgZHBseXI6OmZpbHRlcihoZXJpdGFiaWxpdHkgPT0gISFoKSAlPiUKICAgICAgICAgIHBsb3RfbWV0cmljcygKICAgICAgICAgICAgbWV0cmljID0gbWV0cmljLAogICAgICAgICAgICB4X3N0ciA9ICJzYW1wbGVfcm93X24iLAogICAgICAgICAgICBmYWNldF9zdHIgPSBOVUxMLAogICAgICAgICAgICBwb2ludF9zaXplID0gcG9pbnRfc2l6ZSwKICAgICAgICAgICAgbGluZV9zaXplID0gbGluZV9zaXplLAogICAgICAgICAgICBlcnJiYXJfd2lkdGggPSBlcnJiYXJfd2lkdGgsCiAgICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICAgICAgICAgICAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgIGFscGhhX3ZhbHVlcyA9IGFscGhhX3ZhbHVlcywKICAgICAgICAgICAgbGVnZW5kX3Bvc2l0aW9uID0gbGVnZW5kX3Bvc2l0aW9uLAogICAgICAgICAgICBjdXN0b21fdGhlbWUgPSBjdXN0b21fdGhlbWUsCiAgICAgICAgICAgIGluc2lkZV9sZWdlbmQgPSBUUlVFCiAgICAgICAgICApICsKICAgICAgICAgIGdncGxvdDI6OmxhYnMoCiAgICAgICAgICAgIHggPSAiU2FtcGxlIFNpemUiLCB5ID0gbWV0cmljX25hbWUsIAogICAgICAgICAgICBjb2xvciA9ICJNZXRob2QiLCBhbHBoYSA9ICJNZXRob2QiCiAgICAgICAgICApCiAgICAgICAgaWYgKGggIT0gaGVyaXRhYmlsaXRpZXNbMV0pIHsKICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgfQogICAgICAgIGlmICh4X21vZGVsICVpbiUgcmVtb3ZlX3hfYXhpc19tb2RlbHMpIHsKICAgICAgICAgIGhlaWdodCA8LSAyLjcyCiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS54ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBoZWlnaHQgPC0gMwogICAgICAgIH0KICAgICAgICBpZiAoISgoaCA9PSBoZXJpdGFiaWxpdGllc1tsZW5ndGgoaGVyaXRhYmlsaXRpZXMpXSkgJiAKICAgICAgICAgICAgICAoeF9tb2RlbCAlaW4lIGtlZXBfbGVnZW5kX3hfbW9kZWxzKSAmIAogICAgICAgICAgICAgICh5X21vZGVsICVpbiUga2VlcF9sZWdlbmRfeV9tb2RlbHMpKSkgewogICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6Omd1aWRlcyhjb2xvciA9ICJub25lIiwgYWxwaGEgPSAibm9uZSIpCiAgICAgICAgfQogICAgICAgIHBsdF9sc1tbYXMuY2hhcmFjdGVyKGgpXV0gPC0gcGx0CiAgICAgIH0KICAgICAgcGx0IDwtIHBhdGNod29yazo6d3JhcF9wbG90cyhwbHRfbHMsIG5yb3cgPSAxKQogICAgICBnZ3Bsb3QyOjpnZ3NhdmUoCiAgICAgICAgZmlsZS5wYXRoKGZpZ3VyZXNfZGlyLCAicmVncmVzc2lvbl9zaW1zIiwKICAgICAgICAgICAgICAgICAgc3ByaW50ZigicmVncmVzc2lvbl9zaW1zXyVzXyVzXyVzX2VycmJhcnMucGRmIiwgeV9tb2RlbCwgeF9tb2RlbCwgbWV0cmljKSksCiAgICAgICAgcGxvdCA9IHBsdCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDE0LCBoZWlnaHQgPSBoZWlnaHQKICAgICAgKQogICAgfSBlbHNlIHsKICAgICAgcGx0IDwtIHJlc3VsdHMgJT4lCiAgICAgICAgcGxvdF9tZXRyaWNzKAogICAgICAgICAgbWV0cmljID0gbWV0cmljLAogICAgICAgICAgeF9zdHIgPSAic2FtcGxlX3Jvd19uIiwKICAgICAgICAgIGZhY2V0X3N0ciA9ICJoZXJpdGFiaWxpdHlfbmFtZSIsCiAgICAgICAgICBwb2ludF9zaXplID0gcG9pbnRfc2l6ZSwKICAgICAgICAgIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwKICAgICAgICAgIGVycmJhcl93aWR0aCA9IGVycmJhcl93aWR0aCwKICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgICAgICAgICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgIGFscGhhX3ZhbHVlcyA9IGFscGhhX3ZhbHVlcywKICAgICAgICAgIGN1c3RvbV90aGVtZSA9IGN1c3RvbV90aGVtZQogICAgICAgICkgKwogICAgICAgIGdncGxvdDI6OmxhYnMoCiAgICAgICAgICB4ID0gIlNhbXBsZSBTaXplIiwgeSA9IG1ldHJpY19uYW1lLAogICAgICAgICAgY29sb3IgPSAiTWV0aG9kIiwgYWxwaGEgPSAiTWV0aG9kIiwKICAgICAgICAgIHRpdGxlID0gc3ByaW50ZigiJXMiLCBzaW1fdGl0bGUpCiAgICAgICAgKQogICAgICB2dGhlbWVzOjpzdWJjaHVua2lmeShwbG90X2Z1bihwbHQpLCBpID0gY2h1bmtfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCwgZmlnX3dpZHRoID0gZmlnX3dpZHRoICogMS4zKQogICAgICBjaHVua19pZHggPC0gY2h1bmtfaWR4ICsgMQogICAgfQogIH0KfQoKYGBgCgoKIyBDbGFzc2lmaWNhdGlvbiBTaW11bGF0aW9ucyB7LnRhYnNldCAudGFic2V0LXZtb2Rlcm59CgpgYGB7ciBldmFsID0gVFJVRSwgcmVzdWx0cyA9ICJhc2lzIn0Ka2VlcF9tZXRob2RzIDwtIGNvbG9yX2RmJG5hbWUgJWluJSBjKCJHTURJX3JpZGdlX1JGIiwgIkdNRElfbG9naXN0aWNfbG9nbG9zc19SRiIsICJNREFfUkYiLCAiTURJX1JGIiwgIk1ESS1vb2JfUkYiLCAiVHJlZVNIQVBfUkYiKQptYW51YWxfY29sb3JfcGFsZXR0ZSA8LSBjb2xvcl9kZiRjb2xvcltrZWVwX21ldGhvZHNdCnNob3dfbWV0aG9kcyA8LSBjb2xvcl9kZiRuYW1lW2tlZXBfbWV0aG9kc10KbWV0aG9kX2xhYmVscyA8LSBjb2xvcl9kZiRsYWJlbFtrZWVwX21ldGhvZHNdCmFscGhhX3ZhbHVlcyA8LSBjKDEsIDEsIHJlcCgwLjQsIGxlbmd0aChtZXRob2RfbGFiZWxzKSAtIDIpKQpsZWdlbmRfcG9zaXRpb24gPC0gYygwLjczLCAwLjQpCgp2YXJ5X3BhcmFtX25hbWUgPC0gImZyYWNfbGFiZWxfY29ycnVwdGlvbl9zYW1wbGVfcm93X24iCnlfbW9kZWxzIDwtIGMoImxvZ2lzdGljIiwgImxzc18zbV8ycl9sb2dpc3RpYyIsICJoaWVyX3BvbHlfM21fMnJfbG9naXN0aWMiLCAibGluZWFyX2xzc18zbV8ycl9sb2dpc3RpYyIpCnhfbW9kZWxzIDwtIGMoImVuaGFuY2VyIiwgImNjbGVfcm5hc2VxIiwgImp1dmVuaWxlIiwgInNwbGljaW5nIikKCnJlbW92ZV94X2F4aXNfbW9kZWxzIDwtIGMoImVuaGFuY2VyIiwgImp1dmVuaWxlIikKa2VlcF9sZWdlbmRfeF9tb2RlbHMgPC0gYygiZW5oYW5jZXIiLCAianV2ZW5pbGUiKQprZWVwX2xlZ2VuZF95X21vZGVscyA8LSBjKCJsb2dpc3RpYyIsICJsaW5lYXJfbHNzXzNtXzJyX2xvZ2lzdGljIikKCmZvciAoeV9tb2RlbCBpbiB5X21vZGVscykgewogIGNhdChzcHJpbnRmKCJcblxuIyMgJXMgey50YWJzZXQgLnRhYnNldC1waWxscyAudGFic2V0LXNxdWFyZX1cblxuIiwgeV9tb2RlbCkpCiAgZm9yICh4X21vZGVsIGluIHhfbW9kZWxzKSB7CiAgICBjYXQoc3ByaW50ZigiXG5cbiMjIyAlcyBcblxuIiwgeF9tb2RlbCkpCiAgICBwbHRfbHMgPC0gbGlzdCgpCiAgICBzaW1fbmFtZSA8LSBzcHJpbnRmKCIlc18lc19kZ3AiLCB4X21vZGVsLCB5X21vZGVsKQogICAgc2ltX3RpdGxlIDwtIGRwbHlyOjpjYXNlX3doZW4oCiAgICAgIHhfbW9kZWwgPT0gImNjbGVfcm5hc2VxIiB+ICJDQ0xFIiwKICAgICAgeF9tb2RlbCA9PSAic3BsaWNpbmciIH4gIlNwbGljaW5nIiwKICAgICAgeF9tb2RlbCA9PSAiZW5oYW5jZXIiIH4gIkVuaGFuY2VyIiwKICAgICAgeF9tb2RlbCA9PSAianV2ZW5pbGUiIH4gIkp1dmVuaWxlIgogICAgKQogICAgbWV0cmljX25hbWUgPC0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgbWV0cmljID09ICJyb2NhdWMiIH4gIkFVUk9DIiwKICAgICAgbWV0cmljID09ICJwcmF1YyIgfiAiUFJBVUMiCiAgICApCiAgICBmbmFtZSA8LSBmaWxlLnBhdGgocmVzdWx0c19kaXIsIHBhc3RlMCgiZ21kaS5jbGFzc2lmaWNhdGlvbl9zaW1zLiIsIHNpbV9uYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInZhcnlpbmdfIiwgdmFyeV9wYXJhbV9uYW1lKSwgCiAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJzZWVkIiwgc2VlZCksICJyZXN1bHRzIikKICAgIGlmIChmaWxlLmV4aXN0cyhzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpICYgcGFyYW1zJHVzZV9jYWNoZWQpIHsKICAgICAgcmVzdWx0cyA8LSByZWFkUkRTKHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgICAgaWYgKGxlbmd0aChzZXRkaWZmKHNob3dfbWV0aG9kcywgdW5pcXVlKHJlc3VsdHMkbWV0aG9kKSkpID4gMCkgewogICAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICAgIHJlZm9ybWF0X3Jlc3VsdHMoKQogICAgICAgIHNhdmVSRFMocmVzdWx0cywgc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKHNwcmludGYoIiVzLmNzdiIsIGZuYW1lKSkgJT4lCiAgICAgICAgcmVmb3JtYXRfcmVzdWx0cygpCiAgICAgIHNhdmVSRFMocmVzdWx0cywgc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgfQogICAgaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICAgICAgZm9yIChoIGluIGZyYWNfbGFiZWxfY29ycnVwdGlvbnMpIHsKICAgICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoZnJhY19sYWJlbF9jb3JydXB0aW9uX25hbWUgPT0gISFoKSAlPiUKICAgICAgICAgIHBsb3RfbWV0cmljcygKICAgICAgICAgICAgbWV0cmljID0gbWV0cmljLAogICAgICAgICAgICB4X3N0ciA9ICJzYW1wbGVfcm93X24iLAogICAgICAgICAgICBmYWNldF9zdHIgPSBOVUxMLAogICAgICAgICAgICBwb2ludF9zaXplID0gcG9pbnRfc2l6ZSwKICAgICAgICAgICAgbGluZV9zaXplID0gbGluZV9zaXplLAogICAgICAgICAgICBlcnJiYXJfd2lkdGggPSBlcnJiYXJfd2lkdGgsCiAgICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICAgICAgICAgICAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgIGFscGhhX3ZhbHVlcyA9IGFscGhhX3ZhbHVlcywKICAgICAgICAgICAgbGVnZW5kX3Bvc2l0aW9uID0gbGVnZW5kX3Bvc2l0aW9uLAogICAgICAgICAgICBjdXN0b21fdGhlbWUgPSBjdXN0b21fdGhlbWUsCiAgICAgICAgICAgIGluc2lkZV9sZWdlbmQgPSBUUlVFCiAgICAgICAgICApICsKICAgICAgICAgIGdncGxvdDI6OmxhYnMoCiAgICAgICAgICAgIHggPSAiU2FtcGxlIFNpemUiLCB5ID0gbWV0cmljX25hbWUsIAogICAgICAgICAgICBjb2xvciA9ICJNZXRob2QiLCBhbHBoYSA9ICJNZXRob2QiCiAgICAgICAgICApCiAgICAgICAgaWYgKGggIT0gZnJhY19sYWJlbF9jb3JydXB0aW9uc1sxXSkgewogICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSkKICAgICAgICB9CiAgICAgICAgaWYgKHhfbW9kZWwgJWluJSByZW1vdmVfeF9heGlzX21vZGVscykgewogICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueCA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSkKICAgICAgICAgIGhlaWdodCA8LSAyLjcyCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGhlaWdodCA8LSAzCiAgICAgICAgfQogICAgICAgIGlmICghKChoID09IGZyYWNfbGFiZWxfY29ycnVwdGlvbnNbbGVuZ3RoKGZyYWNfbGFiZWxfY29ycnVwdGlvbnMpXSkgJiAKICAgICAgICAgICAgICAoeF9tb2RlbCAlaW4lIGtlZXBfbGVnZW5kX3hfbW9kZWxzKSAmIAogICAgICAgICAgICAgICh5X21vZGVsICVpbiUga2VlcF9sZWdlbmRfeV9tb2RlbHMpKSkgewogICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6Omd1aWRlcyhjb2xvciA9ICJub25lIiwgYWxwaGEgPSAibm9uZSIpCiAgICAgICAgfQogICAgICAgIHBsdF9sc1tbYXMuY2hhcmFjdGVyKGgpXV0gPC0gcGx0CiAgICAgIH0KICAgICAgcGx0IDwtIHBhdGNod29yazo6d3JhcF9wbG90cyhwbHRfbHMsIG5yb3cgPSAxKQogICAgICBnZ3Bsb3QyOjpnZ3NhdmUoCiAgICAgICAgZmlsZS5wYXRoKGZpZ3VyZXNfZGlyLCAiY2xhc3NpZmljYXRpb25fc2ltcyIsCiAgICAgICAgICAgICAgICAgIHNwcmludGYoImNsYXNzaWZpY2F0aW9uX3NpbXNfJXNfJXNfJXNfZXJyYmFycy5wZGYiLCB5X21vZGVsLCB4X21vZGVsLCBtZXRyaWMpKSwKICAgICAgICBwbG90ID0gcGx0LCB1bml0cyA9ICJpbiIsIHdpZHRoID0gMTQsIGhlaWdodCA9IGhlaWdodAogICAgICApCiAgICB9IGVsc2UgewogICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICBwbG90X21ldHJpY3MoCiAgICAgICAgICBtZXRyaWMgPSBtZXRyaWMsCiAgICAgICAgICB4X3N0ciA9ICJzYW1wbGVfcm93X24iLAogICAgICAgICAgZmFjZXRfc3RyID0gImZyYWNfbGFiZWxfY29ycnVwdGlvbl9uYW1lIiwKICAgICAgICAgIHBvaW50X3NpemUgPSBwb2ludF9zaXplLAogICAgICAgICAgbGluZV9zaXplID0gbGluZV9zaXplLAogICAgICAgICAgZXJyYmFyX3dpZHRoID0gZXJyYmFyX3dpZHRoLAogICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICAgICAgICAgIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgYWxwaGFfdmFsdWVzID0gYWxwaGFfdmFsdWVzLAogICAgICAgICAgY3VzdG9tX3RoZW1lID0gY3VzdG9tX3RoZW1lCiAgICAgICAgKSArCiAgICAgICAgZ2dwbG90Mjo6bGFicygKICAgICAgICAgIHggPSAiU2FtcGxlIFNpemUiLCB5ID0gbWV0cmljX25hbWUsCiAgICAgICAgICBjb2xvciA9ICJNZXRob2QiLCBhbHBoYSA9ICJNZXRob2QiLAogICAgICAgICAgdGl0bGUgPSBzcHJpbnRmKCIlcyIsIHNpbV90aXRsZSkKICAgICAgICApCiAgICAgIHZ0aGVtZXM6OnN1YmNodW5raWZ5KHBsb3RfZnVuKHBsdCksIGkgPSBjaHVua19pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ19oZWlnaHQgPSBmaWdfaGVpZ2h0LCBmaWdfd2lkdGggPSBmaWdfd2lkdGggKiAxLjMpCiAgICAgIGNodW5rX2lkeCA8LSBjaHVua19pZHggKyAxCiAgICB9CiAgfQp9CmBgYAoKCiMgUm9idXN0IFNpbXVsYXRpb25zIHsudGFic2V0IC50YWJzZXQtdm1vZGVybn0KCmBgYHtyIGV2YWwgPSBUUlVFLCByZXN1bHRzID0gImFzaXMifQprZWVwX21ldGhvZHMgPC0gY29sb3JfZGYkbmFtZSAlaW4lIGMoIkdNRElfcmlkZ2VfbG9vX3IyX1JGIiwgIkdNRElfSHViZXJfbG9vX2h1YmVyX2xvc3NfUkYiLCAiTURBX1JGIiwgIk1ESV9SRiIsICJNREktb29iX1JGIiwgIlRyZWVTSEFQX1JGIikKbWFudWFsX2NvbG9yX3BhbGV0dGUgPC0gY29sb3JfZGYkY29sb3Jba2VlcF9tZXRob2RzXQpzaG93X21ldGhvZHMgPC0gY29sb3JfZGYkbmFtZVtrZWVwX21ldGhvZHNdCm1ldGhvZF9sYWJlbHMgPC0gY29sb3JfZGYkbGFiZWxba2VlcF9tZXRob2RzXQphbHBoYV92YWx1ZXMgPC0gYygxLCAxLCByZXAoMC40LCBsZW5ndGgobWV0aG9kX2xhYmVscykgLSAyKSkKbGVnZW5kX3Bvc2l0aW9uIDwtIGMoMC43MywgMC40KQoKdmFyeV9wYXJhbV9uYW1lIDwtICJjb3JydXB0X3NpemVfc2FtcGxlX3Jvd19uIgp5X21vZGVscyA8LSBjKCJsaW5lYXIiLCAibHNzXzNtXzJyIiwgImhpZXJfcG9seV8zbV8yciIsICJsaW5lYXJfbHNzXzNtXzJyIikKeF9tb2RlbHMgPC0gYygiZW5oYW5jZXIiLCAiY2NsZV9ybmFzZXEiKQoKcmVtb3ZlX3hfYXhpc19tb2RlbHMgPC0gYygxMCkKa2VlcF9sZWdlbmRfeF9tb2RlbHMgPC0gYygiZW5oYW5jZXIiLCAiY2NsZV9ybmFzZXEiKQprZWVwX2xlZ2VuZF95X21vZGVscyA8LSBjKCJsaW5lYXIiLCAibGluZWFyX2xzc18zbV8yciIpCmtlZXBfbGVnZW5kX21lYW5fc2hpZnRzIDwtIGMoMTApCgpmb3IgKHlfbW9kZWwgaW4geV9tb2RlbHMpIHsKICBjYXQoc3ByaW50ZigiXG5cbiMjICVzIHsudGFic2V0IC50YWJzZXQtcGlsbHMgLnRhYnNldC1zcXVhcmV9XG5cbiIsIHlfbW9kZWwpKQogIGZvciAoeF9tb2RlbCBpbiB4X21vZGVscykgewogICAgY2F0KHNwcmludGYoIlxuXG4jIyMgJXMgey50YWJzZXQgLnRhYnNldC1waWxscyAudGFic2V0LWNpcmNsZX0gXG5cbiIsIHhfbW9kZWwpKQogICAgc2ltX3RpdGxlIDwtIGRwbHlyOjpjYXNlX3doZW4oCiAgICAgIHhfbW9kZWwgPT0gImNjbGVfcm5hc2VxIiB+ICJDQ0xFIiwKICAgICAgeF9tb2RlbCA9PSAic3BsaWNpbmciIH4gIlNwbGljaW5nIiwKICAgICAgeF9tb2RlbCA9PSAiZW5oYW5jZXIiIH4gIkVuaGFuY2VyIiwKICAgICAgeF9tb2RlbCA9PSAianV2ZW5pbGUiIH4gIkp1dmVuaWxlIgogICAgKQogICAgZm9yIChtZWFuX3NoaWZ0IGluIG1lYW5fc2hpZnRzKSB7CiAgICAgIGNhdChzcHJpbnRmKCJcblxuIyMjIyBNZWFuIFNoaWZ0ID0gJXMgXG5cbiIsIG1lYW5fc2hpZnQpKQogICAgICBwbHRfbHMgPC0gbGlzdCgpCiAgICAgIHNpbV9uYW1lIDwtIHNwcmludGYoIiVzXyVzXyVzTVNfcm9idXN0X2RncCIsIHhfbW9kZWwsIHlfbW9kZWwsIG1lYW5fc2hpZnQpCiAgICAgIGZuYW1lIDwtIGZpbGUucGF0aChyZXN1bHRzX2RpciwgcGFzdGUwKCJnbWRpLnJvYnVzdF9zaW1zLiIsIHNpbV9uYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgidmFyeWluZ18iLCB2YXJ5X3BhcmFtX25hbWUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgic2VlZCIsIHNlZWQpLCAicmVzdWx0cyIpCiAgICAgIGlmIChmaWxlLmV4aXN0cyhzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpICYgcGFyYW1zJHVzZV9jYWNoZWQpIHsKICAgICAgICByZXN1bHRzIDwtIHJlYWRSRFMoc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgICAgIGlmIChsZW5ndGgoc2V0ZGlmZihzaG93X21ldGhvZHMsIHVuaXF1ZShyZXN1bHRzJG1ldGhvZCkpKSA+IDApIHsKICAgICAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICAgICAgcmVmb3JtYXRfcmVzdWx0cygpCiAgICAgICAgICBzYXZlUkRTKHJlc3VsdHMsIHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChzcHJpbnRmKCIlcy5jc3YiLCBmbmFtZSkpICU+JQogICAgICAgICAgcmVmb3JtYXRfcmVzdWx0cygpCiAgICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgIH0KICAgICAgbWV0cmljX25hbWUgPC0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgICBtZXRyaWMgPT0gInJvY2F1YyIgfiAiQVVST0MiLAogICAgICAgIG1ldHJpYyA9PSAicHJhdWMiIH4gIlBSQVVDIiwKICAgICAgICBUUlVFIH4gbWV0cmljCiAgICAgICkKICAgICAgaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICAgICAgICB0bXAgPC0gcmVzdWx0cyAlPiUKICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoY29ycnVwdF9zaXplX25hbWUgJWluJSBjb3JydXB0X3NpemVzLAogICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgJWluJSBzaG93X21ldGhvZHMpICU+JQogICAgICAgICAgZHBseXI6Omdyb3VwX2J5KHNhbXBsZV9yb3dfbiwgY29ycnVwdF9zaXplX25hbWUsIG1ldGhvZCkgJT4lCiAgICAgICAgICBkcGx5cjo6c3VtbWFyaXNlKG1lYW4gPSBtZWFuKC5kYXRhW1ttXV0pKQogICAgICAgIG1pbl95IDwtIG1pbih0bXAkbWVhbikKICAgICAgICBtYXhfeSA8LSBtYXgodG1wJG1lYW4pCiAgICAgICAgZm9yIChoIGluIGNvcnJ1cHRfc2l6ZXMpIHsKICAgICAgICAgIHBsdCA8LSByZXN1bHRzICU+JQogICAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGNvcnJ1cHRfc2l6ZV9uYW1lID09ICEhaCkgJT4lCiAgICAgICAgICAgIHBsb3RfbWV0cmljcygKICAgICAgICAgICAgICBtZXRyaWMgPSBtZXRyaWMsCiAgICAgICAgICAgICAgeF9zdHIgPSAic2FtcGxlX3Jvd19uIiwKICAgICAgICAgICAgICBmYWNldF9zdHIgPSBOVUxMLAogICAgICAgICAgICAgIHBvaW50X3NpemUgPSBwb2ludF9zaXplLAogICAgICAgICAgICAgIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwKICAgICAgICAgICAgICBlcnJiYXJfd2lkdGggPSBlcnJiYXJfd2lkdGgsCiAgICAgICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgICAgICAgICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgICAgICAgICAgICAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgICAgYWxwaGFfdmFsdWVzID0gYWxwaGFfdmFsdWVzLAogICAgICAgICAgICAgIGxlZ2VuZF9wb3NpdGlvbiA9IGxlZ2VuZF9wb3NpdGlvbiwKICAgICAgICAgICAgICBjdXN0b21fdGhlbWUgPSBjdXN0b21fdGhlbWUsCiAgICAgICAgICAgICAgaW5zaWRlX2xlZ2VuZCA9IFRSVUUKICAgICAgICAgICAgKSArCiAgICAgICAgICAgIGdncGxvdDI6OmxhYnMoCiAgICAgICAgICAgICAgeCA9ICJTYW1wbGUgU2l6ZSIsIHkgPSBtZXRyaWNfbmFtZSwgCiAgICAgICAgICAgICAgY29sb3IgPSAiTWV0aG9kIiwgYWxwaGEgPSAiTWV0aG9kIgogICAgICAgICAgICApCiAgICAgICAgICBpZiAoaCAhPSBjb3JydXB0X3NpemVzWzFdKSB7CiAgICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgICB9CiAgICAgICAgICBpZiAobWVhbl9zaGlmdCAlaW4lIHJlbW92ZV94X2F4aXNfbW9kZWxzKSB7CiAgICAgICAgICAgIGhlaWdodCA8LSAyLjcyCiAgICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnggPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBoZWlnaHQgPC0gMwogICAgICAgICAgfQogICAgICAgICAgaWYgKCEoKGggPT0gY29ycnVwdF9zaXplc1tsZW5ndGgoY29ycnVwdF9zaXplcyldKSAmIAogICAgICAgICAgICAgICAgKG1lYW5fc2hpZnQgJWluJSBrZWVwX2xlZ2VuZF9tZWFuX3NoaWZ0cykgJgogICAgICAgICAgICAgICAgKHhfbW9kZWwgJWluJSBrZWVwX2xlZ2VuZF94X21vZGVscykgJiAKICAgICAgICAgICAgICAgICh5X21vZGVsICVpbiUga2VlcF9sZWdlbmRfeV9tb2RlbHMpKSkgewogICAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6Z3VpZGVzKGNvbG9yID0gIm5vbmUiLCBhbHBoYSA9ICJub25lIikKICAgICAgICAgIH0KICAgICAgICAgIHBsdF9sc1tbYXMuY2hhcmFjdGVyKGgpXV0gPC0gcGx0CiAgICAgICAgfQogICAgICAgIHBsdCA8LSBwYXRjaHdvcms6OndyYXBfcGxvdHMocGx0X2xzLCBucm93ID0gMSkKICAgICAgICBnZ3Bsb3QyOjpnZ3NhdmUoCiAgICAgICAgICBmaWxlLnBhdGgoZmlndXJlc19kaXIsICJyb2J1c3Rfc2ltcyIsCiAgICAgICAgICAgICAgICAgICAgc3ByaW50Zigicm9idXN0X3NpbXNfJXNfJXNfJXNNU18lc19lcnJiYXJzLnBkZiIsIHlfbW9kZWwsIHhfbW9kZWwsIG1lYW5fc2hpZnQsIG1ldHJpYykpLAogICAgICAgICAgcGxvdCA9IHBsdCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDE0LCBoZWlnaHQgPSBoZWlnaHQKICAgICAgICApCiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGx0IDwtIHJlc3VsdHMgJT4lCiAgICAgICAgICBwbG90X21ldHJpY3MoCiAgICAgICAgICAgIG1ldHJpYyA9IG1ldHJpYywKICAgICAgICAgICAgeF9zdHIgPSAic2FtcGxlX3Jvd19uIiwKICAgICAgICAgICAgZmFjZXRfc3RyID0gImNvcnJ1cHRfc2l6ZV9uYW1lIiwKICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IHBvaW50X3NpemUsCiAgICAgICAgICAgIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwKICAgICAgICAgICAgZXJyYmFyX3dpZHRoID0gZXJyYmFyX3dpZHRoLAogICAgICAgICAgICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICAgICAgICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgICAgICAgICAgIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICBhbHBoYV92YWx1ZXMgPSBhbHBoYV92YWx1ZXMsCiAgICAgICAgICAgIGN1c3RvbV90aGVtZSA9IGN1c3RvbV90aGVtZQogICAgICAgICAgKSArCiAgICAgICAgICBnZ3Bsb3QyOjpsYWJzKAogICAgICAgICAgICB4ID0gIlNhbXBsZSBTaXplIiwgeSA9IG1ldHJpY19uYW1lLAogICAgICAgICAgICBjb2xvciA9ICJNZXRob2QiLCBhbHBoYSA9ICJNZXRob2QiLAogICAgICAgICAgICB0aXRsZSA9IHNwcmludGYoIiVzIiwgc2ltX3RpdGxlKQogICAgICAgICAgKQogICAgICAgIHZ0aGVtZXM6OnN1YmNodW5raWZ5KHBsb3RfZnVuKHBsdCksIGkgPSBjaHVua19pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlnX2hlaWdodCA9IGZpZ19oZWlnaHQsIGZpZ193aWR0aCA9IGZpZ193aWR0aCAqIDEuMykKICAgICAgICBjaHVua19pZHggPC0gY2h1bmtfaWR4ICsgMQogICAgICB9CiAgICB9CiAgfQp9CgpgYGAKCgojIENvcnJlbGF0aW9uIEJpYXMgU2ltdWxhdGlvbnMgey50YWJzZXQgLnRhYnNldC12bW9kZXJufQoKIyMgTWFpbiBGaWd1cmVzIHsudGFic2V0IC50YWJzZXQtcGlsbHMgLnRhYnNldC1zcXVhcmV9CgpgYGB7ciBldmFsID0gVFJVRSwgcmVzdWx0cyA9ICJhc2lzIn0KbWFudWFsX2NvbG9yX3BhbGV0dGUgPC0gYygiYmxhY2siLCAiIzIxOGExZSIsICJvcmFuZ2UiLCAiIzcxYmViNyIsICIjY2MzMzk5IikKc2hvd19tZXRob2RzIDwtIGMoIkdNREkiLCAiTURJLW9vYiIsICJNREEiLCAiTURJIiwgICJUcmVlU0hBUCIpCm1ldGhvZF9sYWJlbHMgPC0gYygiTURJKyAocmlkZ2UpIiwgIk1ESS1vb2IiLCAiTURBIiwgIk1ESSIsICJUcmVlU0hBUCIpCgpjdXN0b21fY29sb3JfcGFsZXR0ZSA8LSBjKCIjMzg3NjFkIiwgIiM5ZGM4OWIiLCAiIzk5MTUwMCIpCmtlZXBfaGVyaXRhYmlsaXRpZXMgPC0gYygwLjEsIDAuNCkKc2ltX25hbWUgPC0gImdtZGkubWRpX2JpYXNfc2ltcy5jb3JyZWxhdGlvbl9zaW1zLm5vcm1hbF9ibG9ja19jb3JfcGFydGlhbF9saW5lYXJfbHNzX2RncCIKZm5hbWUgPC0gZmlsZS5wYXRoKAogIHJlc3VsdHNfZGlyLCAKICBzaW1fbmFtZSwKICAidmFyeWluZ19oZXJpdGFiaWxpdHlfcmhvIiwKICBzcHJpbnRmKCJzZWVkJXMiLCBzZWVkKSwKICAicmVzdWx0cy5jc3YiCikKcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChmbmFtZSkgJT4lCiAgZHBseXI6OmZpbHRlcihoZXJpdGFiaWxpdHlfbmFtZSAlaW4lIGtlZXBfaGVyaXRhYmlsaXRpZXMpCgpuIDwtIDI1MApwIDwtIDEwMApzaWdfaWRzIDwtIDA6NQpjbnNpZ19pZHMgPC0gNjo0OQpucmVwcyA8LSBsZW5ndGgodW5pcXVlKHJlc3VsdHMkcmVwKSkKCiMjIyMgRXhhbWluZSBhdmVyYWdlIHJhbmsgYWNyb3NzIHZhcnlpbmcgY29ycmVsYXRpb24gbGV2ZWxzICMjIyMKcGx0X2Jhc2UgPC0gcGxvdF9wZXJ0dXJiYXRpb25fc3RhYmlsaXR5KAogIHJlc3VsdHMsCiAgZmFjZXRfcm93cyA9ICJoZXJpdGFiaWxpdHlfbmFtZSIsCiAgZmFjZXRfY29scyA9ICJyaG9fbmFtZSIsCiAgcGFyYW1fbmFtZSA9IE5VTEwsCiAgc2lnX2lkcyA9IHNpZ19pZHMsCiAgY25zaWdfaWRzID0gY25zaWdfaWRzLAogIHBsb3RfdHlwZXMgPSAiZXJyYmFyIiwKICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscwopCgpmb3IgKGlkeCBpbiAxOmxlbmd0aChrZWVwX2hlcml0YWJpbGl0aWVzKSkgewogIGggPC0ga2VlcF9oZXJpdGFiaWxpdGllc1tpZHhdCiAgY2F0KHNwcmludGYoIlxuXG4jIyMgUFZFID0gJXNcblxuIiwgaCkpCiAgcGx0X2RmIDwtIHBsdF9iYXNlJGFnZ1tbaWR4XV0kZGF0YQogIHBsdF9scyA8LSBsaXN0KCkKICBmb3IgKG1ldGhvZCBpbiBtZXRob2RfbGFiZWxzKSB7CiAgICBwbHRfbHNbW21ldGhvZF1dIDwtIHBsdF9kZiAlPiUKICAgICAgZHBseXI6OmZpbHRlcihmaSA9PSBtZXRob2QpICU+JQogICAgICBnZ3Bsb3QyOjpnZ3Bsb3QoKSArCiAgICAgIGdncGxvdDI6OmFlcyh4ID0gcmhvX25hbWUsIHkgPSAubWVhbiwgY29sb3IgPSBncm91cCkgKwogICAgICBnZ3Bsb3QyOjpnZW9tX2xpbmUoKSArCiAgICAgIGdncGxvdDI6Omdlb21fcmliYm9uKAogICAgICAgIGdncGxvdDI6OmFlcyh4ID0gcmhvX25hbWUsIAogICAgICAgICAgICAgICAgICAgICB5bWluID0gLm1lYW4gLSAoLnNkIC8gc3FydChucmVwcykpLCAKICAgICAgICAgICAgICAgICAgICAgeW1heCA9IC5tZWFuICsgKC5zZCAvIHNxcnQobnJlcHMpKSwgCiAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBncm91cCksIAogICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UsIGFscGhhID0gMC4yCiAgICAgICkgKwogICAgICBnZ3Bsb3QyOjpsYWJzKAogICAgICAgIHggPSBleHByZXNzaW9uKCJDb3JyZWxhdGlvbiAoIipyaG8qIikiKSwgCiAgICAgICAgeSA9ICJBdmVyYWdlIFJhbmsiLCAKICAgICAgICBjb2xvciA9ICJGZWF0dXJlXG5Hcm91cCIsIAogICAgICAgIHRpdGxlID0gbWV0aG9kCiAgICAgICkgKwogICAgICBnZ3Bsb3QyOjpjb29yZF9jYXJ0ZXNpYW4oCiAgICAgICAgeWxpbSA9IGMobWluKHBsdF9kZiQubWVhbikgLSAzLCBtYXgocGx0X2RmJC5tZWFuKSArIDMpCiAgICAgICkgKwogICAgICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9tYW51YWwoCiAgICAgICAgdmFsdWVzID0gY3VzdG9tX2NvbG9yX3BhbGV0dGUsIGd1aWRlID0gZ2dwbG90Mjo6Z3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKQogICAgICApICsKICAgICAgZ2dwbG90Mjo6c2NhbGVfZmlsbF9tYW51YWwoCiAgICAgICAgdmFsdWVzID0gY3VzdG9tX2NvbG9yX3BhbGV0dGUsIGd1aWRlID0gZ2dwbG90Mjo6Z3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKQogICAgICApICsKICAgICAgZ2dwbG90Mjo6Z3VpZGVzKGZpbGwgPSAibm9uZSIsIGxpbmV0eXBlID0gIm5vbmUiKSArCiAgICAgIHZ0aGVtZXM6OnRoZW1lX3Ztb2Rlcm4oCiAgICAgICAgc2l6ZV9wcmVzZXQgPSAibWVkaXVtIiwgYmdfY29sb3IgPSAid2hpdGUiLCBncmlkX2NvbG9yID0gIndoaXRlIiwKICAgICAgICBheGlzLnRpY2tzID0gZ2dwbG90Mjo6ZWxlbWVudF9saW5lKHNpemUgPSBnZ3Bsb3QyOjpyZWwoMiksIGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIGF4aXMudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgIGF4aXMudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4LCBmYWNlID0gInBsYWluIiksCiAgICAgICAgbGVnZW5kLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgICAgICBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpCiAgICAgICkKICAgIGlmIChtZXRob2QgIT0gbWV0aG9kX2xhYmVsc1sxXSkgewogICAgICBwbHRfbHNbW21ldGhvZF1dIDwtIHBsdF9sc1tbbWV0aG9kXV0gKwogICAgICAgIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpY2tzLnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICB9CiAgfQogIAogIHBsdF93aWRlIDwtIHBhdGNod29yazo6d3JhcF9wbG90cyhwbHRfbHMsIGd1aWRlcyA9ICJjb2xsZWN0IiwgbnJvdyA9IDEpCiAgaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICAgIGdncGxvdDI6Omdnc2F2ZShwbHRfd2lkZSwgZmlsZW5hbWUgPSBmaWxlLnBhdGgoZmlndXJlc19kaXIsIHNwcmludGYoImNvcnJlbGF0aW9uX3NpbV9wdmUlc193aWRlLnBkZiIsIGgpKSwKICAgICAgICAgICAgICAgICAgICAjIGhlaWdodCA9IGZpZ19oZWlnaHQgKiAuNTUsIHdpZHRoID0gZmlnX3dpZHRoICogLjI1ICogbGVuZ3RoKHNob3dfbWV0aG9kcykpCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gZmlnX2hlaWdodCAqIC41NSwgd2lkdGggPSBmaWdfd2lkdGggKiAuMyAqIGxlbmd0aChzaG93X21ldGhvZHMpKQogIH0gZWxzZSB7CiAgICB2dGhlbWVzOjpzdWJjaHVua2lmeSgKICAgICAgcGx0X3dpZGUsIGkgPSBjaHVua19pZHgsIGZpZ19oZWlnaHQgPSBmaWdfaGVpZ2h0ICogLjgsIGZpZ193aWR0aCA9IGZpZ193aWR0aCAqIDEuMwogICAgKQogICAgY2h1bmtfaWR4IDwtIGNodW5rX2lkeCArIDEKICB9Cn0KCgojIyMjIEV4YW1pbmUgbnVtYmVyIG9mIHNwbGl0cyBhY3Jvc3MgdmFyeWluZyBjb3JyZWxhdGlvbiBsZXZlbHMgIyMjIwpjYXQoIlxuXG4jIyMgTnVtYmVyIG9mIFJGIFNwbGl0cyBcblxuIikKcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChmbmFtZSkgJT4lCiAgZHBseXI6OmZpbHRlcihoZXJpdGFiaWxpdHlfbmFtZSAlaW4lIGtlZXBfaGVyaXRhYmlsaXRpZXMsCiAgICAgICAgICAgICAgICBmaSA9PSAiTURJX3dpdGhfc3BsaXRzIikKCnRvdGFsX3NwbGl0cyA8LSByZXN1bHRzICU+JQogIGRwbHlyOjpncm91cF9ieShyaG9fbmFtZSwgaGVyaXRhYmlsaXR5LCByZXApICU+JQogIGRwbHlyOjpzdW1tYXJpc2Uobl9zcGxpdHMgPSBzdW0oYXZfc3BsaXRzKSkKCnBsdF9kZiA8LSByZXN1bHRzICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4oCiAgICB0b3RhbF9zcGxpdHMsIGJ5ID0gYygicmhvX25hbWUiLCAiaGVyaXRhYmlsaXR5IiwgInJlcCIpCiAgKSAlPiUKICBkcGx5cjo6bXV0YXRlKAogICAgYXZfc3BsaXRzID0gYXZfc3BsaXRzIC8gbl9zcGxpdHMgKiAxMDAsCiAgICBncm91cCA9IGRwbHlyOjpjYXNlX3doZW4oCiAgICAgIHZhciAlaW4lIHNpZ19pZHMgfiAiU2lnIiwKICAgICAgdmFyICVpbiUgY25zaWdfaWRzIH4gIkMtTlNpZyIsCiAgICAgIFRSVUUgfiAiTlNpZyIKICAgICkKICApICU+JQogIGRwbHlyOjptdXRhdGUoCiAgICBncm91cCA9IGZhY3Rvcihncm91cCwgbGV2ZWxzID0gYygiU2lnIiwgIkMtTlNpZyIsICJOU2lnIikpCiAgKSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkocmhvX25hbWUsIGhlcml0YWJpbGl0eSwgZ3JvdXApICU+JQogIGRwbHlyOjpzdW1tYXJpc2UoCiAgICAubWVhbiA9IG1lYW4oYXZfc3BsaXRzKSwKICAgIC5zZCA9IHNkKGF2X3NwbGl0cykKICApCgptaW5feSA8LSBtaW4ocGx0X2RmJC5tZWFuKQptYXhfeSA8LSBtYXgocGx0X2RmJC5tZWFuKQoKcGx0X2xzIDwtIGxpc3QoKQpmb3IgKGlkeCBpbiAxOmxlbmd0aChrZWVwX2hlcml0YWJpbGl0aWVzKSkgewogIGggPC0ga2VlcF9oZXJpdGFiaWxpdGllc1tpZHhdCiAgcGx0IDwtIHBsdF9kZiAlPiUKICAgIGRwbHlyOjpmaWx0ZXIoaGVyaXRhYmlsaXR5ID09ICEhaCkgJT4lCiAgICBnZ3Bsb3QyOjpnZ3Bsb3QoKSArCiAgICBnZ3Bsb3QyOjphZXMoeCA9IHJob19uYW1lLCB5ID0gLm1lYW4sIGNvbG9yID0gZ3JvdXApICsKICAgIGdncGxvdDI6Omdlb21fbGluZShzaXplID0gMSkgKwogICAgIyBnZ3Bsb3QyOjpnZW9tX3JpYmJvbigKICAgICMgICBnZ3Bsb3QyOjphZXMoeCA9IHJob19uYW1lLCAKICAgICMgICAgICAgICAgICAgICAgeW1pbiA9IC5tZWFuIC0gKC5zZCAvIHNxcnQobnJlcHMpKSwgCiAgICAjICAgICAgICAgICAgICAgIHltYXggPSAubWVhbiArICguc2QgLyBzcXJ0KG5yZXBzKSksIAogICAgIyAgICAgICAgICAgICAgICBmaWxsID0gZ3JvdXApLCAKICAgICMgICBpbmhlcml0LmFlcyA9IEZBTFNFLCBhbHBoYSA9IDAuMgogICAgIyApICsKICAgIGdncGxvdDI6OmxhYnMoCiAgICAgIHggPSBleHByZXNzaW9uKCJDb3JyZWxhdGlvbiAoIipyaG8qIikiKSwgCiAgICAgIHkgPSAiUGVyY2VudGFnZSBvZiBTcGxpdHMgaW4gUkYgKCUpIiwKICAgICAgY29sb3IgPSAiRmVhdHVyZVxuR3JvdXAiLCAKICAgICAgdGl0bGUgPSBzcHJpbnRmKCJQVkUgPSAlcyIsIGgpCiAgICApICsKICAgIGdncGxvdDI6OmNvb3JkX2NhcnRlc2lhbih5bGltID0gYyhtaW5feSwgbWF4X3kpKSArCiAgICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9tYW51YWwoCiAgICAgIHZhbHVlcyA9IGN1c3RvbV9jb2xvcl9wYWxldHRlLCBndWlkZSA9IGdncGxvdDI6Omd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkKICAgICkgKwogICAgZ2dwbG90Mjo6c2NhbGVfZmlsbF9tYW51YWwoCiAgICAgIHZhbHVlcyA9IGN1c3RvbV9jb2xvcl9wYWxldHRlLCBndWlkZSA9IGdncGxvdDI6Omd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkKICAgICkgKwogICAgZ2dwbG90Mjo6Z3VpZGVzKGZpbGwgPSAibm9uZSIsIGxpbmV0eXBlID0gIm5vbmUiKSArCiAgICB2dGhlbWVzOjp0aGVtZV92bW9kZXJuKAogICAgICBzaXplX3ByZXNldCA9ICJtZWRpdW0iLCBiZ19jb2xvciA9ICJ3aGl0ZSIsIGdyaWRfY29sb3IgPSAid2hpdGUiLAogICAgICBheGlzLnRpY2tzID0gZ2dwbG90Mjo6ZWxlbWVudF9saW5lKHNpemUgPSBnZ3Bsb3QyOjpyZWwoMiksIGNvbG91ciA9ICJibGFjayIpLAogICAgICBheGlzLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgYXhpcy50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTgsIGZhY2UgPSAicGxhaW4iKSwKICAgICAgbGVnZW5kLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgbGVnZW5kLnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxOCksCiAgICAgIHBsb3QudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBmYWNlID0gImJvbGQiLCBoanVzdCA9IDAuNSkKICAgICkKICBpZiAoaWR4ICE9IDEpIHsKICAgIHBsdCA8LSBwbHQgKwogICAgICBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgfQogIHBsdF9sc1tbaWR4XV0gPC0gcGx0Cn0KCnBsdF93aWRlIDwtIHBhdGNod29yazo6d3JhcF9wbG90cyhwbHRfbHMsIGd1aWRlcyA9ICJjb2xsZWN0IiwgbnJvdyA9IDEpCmlmIChwYXJhbXMkZm9yX3BhcGVyKSB7CiAgZ2dwbG90Mjo6Z2dzYXZlKHBsdF93aWRlICYgZ2dwbG90Mjo6dGhlbWUocGxvdC50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSksIAogICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGUucGF0aChmaWd1cmVzX2RpciwgImNvcnJlbGF0aW9uX3NpbV9udW1fc3BsaXRzLnBkZiIpLAogICAgICAgICAgICAgICAgICB3aWR0aCA9IGZpZ193aWR0aCAqIDEsIGhlaWdodCA9IGZpZ19oZWlnaHQgKiAuNjUpCn0gZWxzZSB7CiAgdnRoZW1lczo6c3ViY2h1bmtpZnkoCiAgICBwbHRfd2lkZSwgaSA9IGNodW5rX2lkeCwgZmlnX2hlaWdodCA9IGZpZ19oZWlnaHQsIGZpZ193aWR0aCA9IGZpZ193aWR0aCAqIDEuMwogICkKICBjaHVua19pZHggPC0gY2h1bmtfaWR4ICsgMQp9CgpgYGAKCiMjIEFwcGVuZGl4IEZpZ3VyZXMgey50YWJzZXQgLnRhYnNldC1waWxscyAudGFic2V0LXNxdWFyZX0KCmBgYHtyIGV2YWwgPSBUUlVFLCByZXN1bHRzID0gImFzaXMifQptYW51YWxfY29sb3JfcGFsZXR0ZSA8LSBjKCJibGFjayIsICJncmF5IikKc2hvd19tZXRob2RzIDwtIGMoIkdNREkiLCAiR01ESV9pbmJhZyIpCm1ldGhvZF9sYWJlbHMgPC0gYygiTURJKyAoTE9PKSIsICJNREkrIChpbi1iYWcpIikKCmN1c3RvbV9jb2xvcl9wYWxldHRlIDwtIGMoIiMzODc2MWQiLCAiIzlkYzg5YiIsICIjOTkxNTAwIikKa2VlcF9oZXJpdGFiaWxpdGllcyA8LSBjKDAuMSwgMC40KQpzaW1fbmFtZSA8LSAiZ21kaS5tZGlfYmlhc19zaW1zLmNvcnJlbGF0aW9uX3NpbXMubm9ybWFsX2Jsb2NrX2Nvcl9wYXJ0aWFsX2xpbmVhcl9sc3NfZGdwIgpmbmFtZSA8LSBmaWxlLnBhdGgoCiAgcmVzdWx0c19kaXIsIAogIHNpbV9uYW1lLAogICJ2YXJ5aW5nX2hlcml0YWJpbGl0eV9yaG8iLAogIHNwcmludGYoInNlZWQlcyIsIHNlZWQpLAogICJyZXN1bHRzLmNzdiIKKQpyZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKGZuYW1lKSAlPiUKICBkcGx5cjo6ZmlsdGVyKGhlcml0YWJpbGl0eV9uYW1lICVpbiUga2VlcF9oZXJpdGFiaWxpdGllcykKCm4gPC0gMjUwCnAgPC0gMTAwCnNpZ19pZHMgPC0gMDo1CmNuc2lnX2lkcyA8LSA2OjQ5Cm5yZXBzIDwtIGxlbmd0aCh1bmlxdWUocmVzdWx0cyRyZXApKQoKIyMjIyBFeGFtaW5lIGF2ZXJhZ2UgcmFuayBhY3Jvc3MgdmFyeWluZyBjb3JyZWxhdGlvbiBsZXZlbHMgIyMjIwpwbHRfYmFzZSA8LSBwbG90X3BlcnR1cmJhdGlvbl9zdGFiaWxpdHkoCiAgcmVzdWx0cywKICBmYWNldF9yb3dzID0gImhlcml0YWJpbGl0eV9uYW1lIiwKICBmYWNldF9jb2xzID0gInJob19uYW1lIiwKICBwYXJhbV9uYW1lID0gTlVMTCwKICBzaWdfaWRzID0gc2lnX2lkcywKICBjbnNpZ19pZHMgPSBjbnNpZ19pZHMsCiAgcGxvdF90eXBlcyA9ICJlcnJiYXIiLAogIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzCikKCmZvciAoaWR4IGluIDE6bGVuZ3RoKGtlZXBfaGVyaXRhYmlsaXRpZXMpKSB7CiAgaCA8LSBrZWVwX2hlcml0YWJpbGl0aWVzW2lkeF0KICBjYXQoc3ByaW50ZigiXG5cbiMjIyBQVkUgPSAlc1xuXG4iLCBoKSkKICBwbHRfZGYgPC0gcGx0X2Jhc2UkYWdnW1tpZHhdXSRkYXRhCiAgcGx0X2xzIDwtIGxpc3QoKQogIGZvciAobWV0aG9kIGluIG1ldGhvZF9sYWJlbHMpIHsKICAgIHBsdF9sc1tbbWV0aG9kXV0gPC0gcGx0X2RmICU+JQogICAgICBkcGx5cjo6ZmlsdGVyKGZpID09IG1ldGhvZCkgJT4lCiAgICAgIGdncGxvdDI6OmdncGxvdCgpICsKICAgICAgZ2dwbG90Mjo6YWVzKHggPSByaG9fbmFtZSwgeSA9IC5tZWFuLCBjb2xvciA9IGdyb3VwKSArCiAgICAgIGdncGxvdDI6Omdlb21fbGluZSgpICsKICAgICAgZ2dwbG90Mjo6Z2VvbV9yaWJib24oCiAgICAgICAgZ2dwbG90Mjo6YWVzKHggPSByaG9fbmFtZSwgCiAgICAgICAgICAgICAgICAgICAgIHltaW4gPSAubWVhbiAtICguc2QgLyBzcXJ0KG5yZXBzKSksIAogICAgICAgICAgICAgICAgICAgICB5bWF4ID0gLm1lYW4gKyAoLnNkIC8gc3FydChucmVwcykpLCAKICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IGdyb3VwKSwgCiAgICAgICAgaW5oZXJpdC5hZXMgPSBGQUxTRSwgYWxwaGEgPSAwLjIKICAgICAgKSArCiAgICAgIGdncGxvdDI6OmxhYnMoCiAgICAgICAgeCA9IGV4cHJlc3Npb24oIkNvcnJlbGF0aW9uICgiKnJobyoiKSIpLCAKICAgICAgICB5ID0gIkF2ZXJhZ2UgUmFuayIsIAogICAgICAgIGNvbG9yID0gIkZlYXR1cmVcbkdyb3VwIiwgCiAgICAgICAgdGl0bGUgPSBtZXRob2QKICAgICAgKSArCiAgICAgIGdncGxvdDI6OmNvb3JkX2NhcnRlc2lhbigKICAgICAgICB5bGltID0gYyhtaW4ocGx0X2RmJC5tZWFuKSAtIDMsIG1heChwbHRfZGYkLm1lYW4pICsgMykKICAgICAgKSArCiAgICAgIGdncGxvdDI6OnNjYWxlX2NvbG9yX21hbnVhbCgKICAgICAgICB2YWx1ZXMgPSBjdXN0b21fY29sb3JfcGFsZXR0ZSwgZ3VpZGUgPSBnZ3Bsb3QyOjpndWlkZV9sZWdlbmQocmV2ZXJzZSA9IFRSVUUpCiAgICAgICkgKwogICAgICBnZ3Bsb3QyOjpzY2FsZV9maWxsX21hbnVhbCgKICAgICAgICB2YWx1ZXMgPSBjdXN0b21fY29sb3JfcGFsZXR0ZSwgZ3VpZGUgPSBnZ3Bsb3QyOjpndWlkZV9sZWdlbmQocmV2ZXJzZSA9IFRSVUUpCiAgICAgICkgKwogICAgICBnZ3Bsb3QyOjpndWlkZXMoZmlsbCA9ICJub25lIiwgbGluZXR5cGUgPSAibm9uZSIpICsKICAgICAgdnRoZW1lczo6dGhlbWVfdm1vZGVybigKICAgICAgICBzaXplX3ByZXNldCA9ICJtZWRpdW0iLCBiZ19jb2xvciA9ICJ3aGl0ZSIsIGdyaWRfY29sb3IgPSAid2hpdGUiLAogICAgICAgIGF4aXMudGlja3MgPSBnZ3Bsb3QyOjplbGVtZW50X2xpbmUoc2l6ZSA9IGdncGxvdDI6OnJlbCgyKSwgY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgYXhpcy50ZXh0ID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgYXhpcy50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTgsIGZhY2UgPSAicGxhaW4iKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTgpLAogICAgICAgIHBsb3QudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBmYWNlID0gImJvbGQiLCBoanVzdCA9IDAuNSkKICAgICAgKQogICAgaWYgKG1ldGhvZCAhPSBtZXRob2RfbGFiZWxzWzFdKSB7CiAgICAgIHBsdF9sc1tbbWV0aG9kXV0gPC0gcGx0X2xzW1ttZXRob2RdXSArCiAgICAgICAgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGlja3MueSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSkKICAgIH0KICB9CiAgCiAgcGx0X3dpZGUgPC0gcGF0Y2h3b3JrOjp3cmFwX3Bsb3RzKHBsdF9scywgZ3VpZGVzID0gImNvbGxlY3QiLCBucm93ID0gMSkKICBpZiAocGFyYW1zJGZvcl9wYXBlcikgewogICAgZ2dwbG90Mjo6Z2dzYXZlKHBsdF93aWRlLCAKICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGUucGF0aChmaWd1cmVzX2Rpciwgc3ByaW50ZigiY29ycmVsYXRpb25fc2ltX3B2ZSVzX3dpZGVfYXBwZW5kaXgucGRmIiwgaCkpLAogICAgICAgICAgICAgICAgICAgICMgaGVpZ2h0ID0gZmlnX2hlaWdodCAqIC41NSwgd2lkdGggPSBmaWdfd2lkdGggKiAuMjUgKiBsZW5ndGgoc2hvd19tZXRob2RzKSkKICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSBmaWdfaGVpZ2h0ICogLjU1LCB3aWR0aCA9IGZpZ193aWR0aCAqIC4zNyAqIGxlbmd0aChzaG93X21ldGhvZHMpKQogIH0gZWxzZSB7CiAgICB2dGhlbWVzOjpzdWJjaHVua2lmeSgKICAgICAgcGx0X3dpZGUsIGkgPSBjaHVua19pZHgsIGZpZ19oZWlnaHQgPSBmaWdfaGVpZ2h0LCBmaWdfd2lkdGggPSBmaWdfd2lkdGggKiAxLjMKICAgICkKICAgIGNodW5rX2lkeCA8LSBjaHVua19pZHggKyAxCiAgfQp9CmBgYAoKCiMgRW50cm9weSBCaWFzIFNpbXVsYXRpb25zIHsudGFic2V0IC50YWJzZXQtdm1vZGVybn0KCiMjIE1haW4gRmlndXJlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtc3F1YXJlfQoKYGBge3IgZXZhbCA9IFRSVUUsIHJlc3VsdHMgPSAiYXNpcyJ9CiMjIyMgRW50cm9weSBSZWdyZXNzaW9uIFJlc3VsdHMgIyMjIwptYW51YWxfY29sb3JfcGFsZXR0ZSA8LSByZXYoYygiYmxhY2siLCAib3JhbmdlIiwgIiM3MWJlYjciLCAiIzIxOGExZSIsICIjY2MzMzk5IikpCnNob3dfbWV0aG9kcyA8LSByZXYoYygiR01ESSIsICJNREEiLCAiTURJIiwgIk1ESS1vb2IiLCAiVHJlZVNIQVAiKSkKbWV0aG9kX2xhYmVscyA8LSByZXYoYygiTURJKyAocmlkZ2UpIiwgIk1EQSIsICJNREkiLCAiTURJLW9vYiIsICJUcmVlU0hBUCIpKQphbHBoYV92YWx1ZXMgPC0gcmV2KGMoMSwgcmVwKDAuNywgbGVuZ3RoKG1ldGhvZF9sYWJlbHMpIC0gMSkpKQp5X2xpbWl0cyA8LSBjKDEsIDQuNSkKCm1ldHJpY19uYW1lIDwtICJBVVJPQyIKc2ltX25hbWUgPC0gImdtZGkubWRpX2JpYXNfc2ltcy5lbnRyb3B5X3NpbXMubGluZWFyX2RncCIKZm5hbWUgPC0gZmlsZS5wYXRoKAogIHJlc3VsdHNfZGlyLCAKICBzaW1fbmFtZSwKICAidmFyeWluZ19oZXJpdGFiaWxpdHlfbiIsCiAgc3ByaW50Zigic2VlZCVzIiwgc2VlZCksCiAgInJlc3VsdHMuY3N2IgopCgojIyMjIEVudHJvcHkgUmVncmVzc2lvbiBBdmcgUmFuayAjIyMjCnJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoZm5hbWUpICU+JQogIGRwbHlyOjpmaWx0ZXIoaGVyaXRhYmlsaXR5X25hbWUgPT0gMC4xKQoKY3VzdG9tX2dyb3VwX2Z1biA8LSBmdW5jdGlvbih2YXIpIHZhcgoKcGx0X2Jhc2UgPC0gcGxvdF9wZXJ0dXJiYXRpb25fc3RhYmlsaXR5KAogIHJlc3VsdHMsCiAgZmFjZXRfcm93cyA9ICJoZXJpdGFiaWxpdHlfbmFtZSIsCiAgZmFjZXRfY29scyA9ICJuX25hbWUiLCAKICBncm91cF9mdW4gPSBjdXN0b21fZ3JvdXBfZnVuLCAKICBwYXJhbV9uYW1lID0gTlVMTCwKICBwbG90X3R5cGVzID0gImVycmJhciIsCiAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMKKQoKcGx0X2RmIDwtIHBsdF9iYXNlJGFnZ1tbMV1dJGRhdGEKbnJlcHMgPC0gbGVuZ3RoKHVuaXF1ZShyZXN1bHRzJHJlcCkpCgpwbHRfcmVncmVzc2lvbiA8LSBwbHRfZGYgJT4lCiAgZHBseXI6OmZpbHRlcihncm91cCA9PSAwKSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBuX25hbWUsIHkgPSAubWVhbiwgY29sb3IgPSBmaSwgYWxwaGEgPSBmaSkgKwogIGdncGxvdDI6Omdlb21fbGluZShzaXplID0gbGluZV9zaXplKSArCiAgZ2dwbG90Mjo6bGFicygKICAgIHggPSAiU2FtcGxlIFNpemUiLAogICAgeSA9IGV4cHJlc3Npb24oIkF2ZXJhZ2UgUmFuayBvZiAiKlhbMV0pLAogICAgY29sb3IgPSAiTWV0aG9kIiwKICAgIHRpdGxlID0gIlJlZ3Jlc3Npb24iCiAgKSArCiAgZ2dwbG90Mjo6Z3VpZGVzKGZpbGwgPSAibm9uZSIsIGFscGhhID0gIm5vbmUiKSArCiAgZ2dwbG90Mjo6c2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGdncGxvdDI6Omd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkpICsKICBnZ3Bsb3QyOjpzY2FsZV9hbHBoYV9tYW51YWwodmFsdWVzID0gYWxwaGFfdmFsdWVzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBnZ3Bsb3QyOjpndWlkZV9sZWdlbmQocmV2ZXJzZSA9IFRSVUUpKSArCiAgZ2dwbG90Mjo6Y29vcmRfY2FydGVzaWFuKHlsaW0gPSB5X2xpbWl0cykgKwogIHZ0aGVtZXM6OnRoZW1lX3Ztb2Rlcm4oCiAgICBzaXplX3ByZXNldCA9ICJtZWRpdW0iLCBiZ19jb2xvciA9ICJ3aGl0ZSIsIGdyaWRfY29sb3IgPSAid2hpdGUiLAogICAgYXhpcy50aWNrcyA9IGdncGxvdDI6OmVsZW1lbnRfbGluZShzaXplID0gZ2dwbG90Mjo6cmVsKDIpLCBjb2xvdXIgPSAiYmxhY2siKSwKICAgIGF4aXMudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgYXhpcy50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTgsIGZhY2UgPSAicGxhaW4iKSwKICAgIGxlZ2VuZC50ZXh0ID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICBsZWdlbmQudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgIHBsb3QudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBmYWNlID0gImJvbGQiLCBoanVzdCA9IDAuNSkKICApCgojIyMjIEVudHJvcHkgUmVncmVzc2lvbiAjIFNwbGl0cyAjIyMjCnJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoZm5hbWUpICU+JQogIGRwbHlyOjpmaWx0ZXIoaGVyaXRhYmlsaXR5X25hbWUgPT0gMC4xLCAKICAgICAgICAgICAgICAgIGZpID09ICJNRElfd2l0aF9zcGxpdHMiKQoKbnJlcHMgPC0gbGVuZ3RoKHVuaXF1ZShyZXN1bHRzJHJlcCkpCgp0b3RhbF9zcGxpdHMgPC0gcmVzdWx0cyAlPiUKICBkcGx5cjo6Z3JvdXBfYnkobl9uYW1lLCBoZXJpdGFiaWxpdHksIHJlcCkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShuX3NwbGl0cyA9IHN1bShhdl9zcGxpdHMpKQoKcmVncmVzc2lvbl9udW1fc3BsaXRzX2RmIDwtIHJlc3VsdHMgJT4lCiAgZHBseXI6OmxlZnRfam9pbigKICAgIHRvdGFsX3NwbGl0cywgYnkgPSBjKCJuX25hbWUiLCAiaGVyaXRhYmlsaXR5IiwgInJlcCIpCiAgKSAlPiUKICBkcGx5cjo6bXV0YXRlKAogICAgYXZfc3BsaXRzID0gYXZfc3BsaXRzIC8gbl9zcGxpdHMgKiAxMDAKICApICU+JQogIGRwbHlyOjpncm91cF9ieShuX25hbWUsIGhlcml0YWJpbGl0eSwgdmFyKSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKAogICAgLm1lYW4gPSBtZWFuKGF2X3NwbGl0cyksCiAgICAuc2QgPSBzZChhdl9zcGxpdHMpCiAgKQoKIyMjIyBFbnRyb3B5IENsYXNzaWZpY2F0aW9uIFJlc3VsdHMgIyMjIwptYW51YWxfY29sb3JfcGFsZXR0ZSA8LSByZXYoYygiYmxhY2siLCAiIzlCNURGRiIsICJvcmFuZ2UiLCAiIzcxYmViNyIsICIjMjE4YTFlIiwgIiNjYzMzOTkiKSkKc2hvd19tZXRob2RzIDwtIHJldihjKCJHTURJX3JpZGdlIiwgIkdNRElfbG9naXN0aWNfbG9nbG9zcyIsICJNREEiLCAiTURJIiwgIk1ESS1vb2IiLCAiVHJlZVNIQVAiKSkKbWV0aG9kX2xhYmVscyA8LSByZXYoYygiTURJKyAocmlkZ2UpIiwgIk1ESSsgKGxvZ2lzdGljKSIsICJNREEiLCAiTURJIiwgIk1ESS1vb2IiLCAiVHJlZVNIQVAiKSkKYWxwaGFfdmFsdWVzIDwtIHJldihjKDEsIDEsIHJlcCgwLjcsIGxlbmd0aChtZXRob2RfbGFiZWxzKSAtIDIpKSkKCm1ldHJpY19uYW1lIDwtICJBVVJPQyIKc2ltX25hbWUgPC0gImdtZGkubWRpX2JpYXNfc2ltcy5lbnRyb3B5X3NpbXMubG9naXN0aWNfZGdwIgpmbmFtZSA8LSBmaWxlLnBhdGgoCiAgcmVzdWx0c19kaXIsIAogIHNpbV9uYW1lLAogICJ2YXJ5aW5nX2NfbiIsCiAgc3ByaW50Zigic2VlZCVzIiwgc2VlZCksCiAgInJlc3VsdHMuY3N2IgopCgojIyMjIEVudHJvcHkgQ2xhc3NpZmljYXRpb24gQXZnIFJhbmsgIyMjIwpyZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKGZuYW1lKQoKY3VzdG9tX2dyb3VwX2Z1biA8LSBmdW5jdGlvbih2YXIpIHZhcgoKcGx0X2Jhc2UgPC0gcGxvdF9wZXJ0dXJiYXRpb25fc3RhYmlsaXR5KAogIHJlc3VsdHMsCiAgZmFjZXRfcm93cyA9ICJjX25hbWUiLAogIGZhY2V0X2NvbHMgPSAibl9uYW1lIiwgCiAgZ3JvdXBfZnVuID0gY3VzdG9tX2dyb3VwX2Z1biwgCiAgcGFyYW1fbmFtZSA9IE5VTEwsCiAgcGxvdF90eXBlcyA9ICJlcnJiYXIiLAogIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzCikKCnBsdF9kZiA8LSBwbHRfYmFzZSRhZ2dbWzFdXSRkYXRhCm5yZXBzIDwtIGxlbmd0aCh1bmlxdWUocmVzdWx0cyRyZXApKQoKcGx0X2NsYXNzaWZpY2F0aW9uIDwtIHBsdF9kZiAlPiUKICBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDApICU+JQogIGdncGxvdDI6OmdncGxvdCgpICsKICBnZ3Bsb3QyOjphZXMoeCA9IG5fbmFtZSwgeSA9IC5tZWFuLCBjb2xvciA9IGZpLCBhbHBoYSA9IGZpKSArCiAgZ2dwbG90Mjo6Z2VvbV9saW5lKHNpemUgPSBsaW5lX3NpemUpICsKICBnZ3Bsb3QyOjpsYWJzKAogICAgeCA9ICJTYW1wbGUgU2l6ZSIsIAogICAgeSA9IGV4cHJlc3Npb24oIkF2ZXJhZ2UgUmFuayBvZiAiKlhbMV0pLCAKICAgIGNvbG9yID0gIk1ldGhvZCIsCiAgICB0aXRsZSA9ICJDbGFzc2lmaWNhdGlvbiIKICApICsKICBnZ3Bsb3QyOjpndWlkZXMoZmlsbCA9ICJub25lIiwgYWxwaGEgPSAibm9uZSIpICsKICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ2dwbG90Mjo6Z3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSkgKwogIGdncGxvdDI6OnNjYWxlX2FscGhhX21hbnVhbCh2YWx1ZXMgPSBhbHBoYV92YWx1ZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGdncGxvdDI6Omd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkpICsKICBnZ3Bsb3QyOjpjb29yZF9jYXJ0ZXNpYW4oCiAgICB5bGltID0geV9saW1pdHMKICApICsKICB2dGhlbWVzOjp0aGVtZV92bW9kZXJuKAogICAgc2l6ZV9wcmVzZXQgPSAibWVkaXVtIiwgYmdfY29sb3IgPSAid2hpdGUiLCBncmlkX2NvbG9yID0gIndoaXRlIiwKICAgIGF4aXMudGlja3MgPSBnZ3Bsb3QyOjplbGVtZW50X2xpbmUoc2l6ZSA9IGdncGxvdDI6OnJlbCgyKSwgY29sb3VyID0gImJsYWNrIiksCiAgICBheGlzLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgIGF4aXMudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4LCBmYWNlID0gInBsYWluIiksCiAgICBsZWdlbmQudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgbGVnZW5kLnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxOCksCiAgICBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpCiAgKQoKIyMjIyBFbnRyb3B5IENsYXNzaWZpY2F0aW9uICMgU3BsaXRzICMjIyMKcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChmbmFtZSkgJT4lCiAgZHBseXI6OmZpbHRlcihmaSA9PSAiTURJX3dpdGhfc3BsaXRzIikKCnRvdGFsX3NwbGl0cyA8LSByZXN1bHRzICU+JQogIGRwbHlyOjpncm91cF9ieShuX25hbWUsIGMsIHJlcCkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShuX3NwbGl0cyA9IHN1bShhdl9zcGxpdHMpKQoKY2xhc3NpZmljYXRpb25fbnVtX3NwbGl0c19kZiA8LSByZXN1bHRzICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4oCiAgICB0b3RhbF9zcGxpdHMsIGJ5ID0gYygibl9uYW1lIiwgImMiLCAicmVwIikKICApICU+JQogIGRwbHlyOjptdXRhdGUoCiAgICBhdl9zcGxpdHMgPSBhdl9zcGxpdHMgLyBuX3NwbGl0cyAqIDEwMAogICkgJT4lCiAgZHBseXI6Omdyb3VwX2J5KG5fbmFtZSwgYywgdmFyKSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKAogICAgLm1lYW4gPSBtZWFuKGF2X3NwbGl0cyksCiAgICAuc2QgPSBzZChhdl9zcGxpdHMpCiAgKQoKIyMjIyBTaG93IEF2ZyBSYW5rIFBsb3QgIyMjIwpjYXQoIlxuXG4jIyMgQXZlcmFnZSBSYW5rIFxuXG4iKQpwbHQgPC0gcGx0X3JlZ3Jlc3Npb24gKyBwbHRfY2xhc3NpZmljYXRpb24KaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICBnZ3Bsb3QyOjpnZ3NhdmUocGx0LCBmaWxlbmFtZSA9IGZpbGUucGF0aChmaWd1cmVzX2RpciwgImVudHJvcHlfc2ltcy5wZGYiKSwgCiAgICAgICAgICAgICAgICAgIHdpZHRoID0gZmlnX3dpZHRoICogMS4yLCBoZWlnaHQgPSBmaWdfaGVpZ2h0ICogLjY1KQp9IGVsc2UgewogIHZ0aGVtZXM6OnN1YmNodW5raWZ5KAogICAgcGx0LCBpID0gY2h1bmtfaWR4LCBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCAqIC44LCBmaWdfd2lkdGggPSBmaWdfd2lkdGggKiAxLjMKICApCiAgY2h1bmtfaWR4IDwtIGNodW5rX2lkeCArIDEKfQoKIyMjIyBTaG93ICMgU3BsaXRzIFBsb3QgIyMjIwpjYXQoIlxuXG4jIyMgTnVtYmVyIG9mIFJGIFNwbGl0cyBcblxuIikKcGx0X2RmIDwtIGRwbHlyOjpiaW5kX3Jvd3MoCiAgUmVncmVzc2lvbiA9IHJlZ3Jlc3Npb25fbnVtX3NwbGl0c19kZiwgCiAgQ2xhc3NpZmljYXRpb24gPSBjbGFzc2lmaWNhdGlvbl9udW1fc3BsaXRzX2RmLCAKICAuaWQgPSAidHlwZSIKKSAlPiUKICBkcGx5cjo6bXV0YXRlKAogICAgdmFyID0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgdmFyID09IDAgfiAiQmVybm91bGxpIChTaWduYWwpIiwKICAgICAgdmFyID09IDEgfiAiTm9ybWFsIChOb24tU2lnbmFsKSIsCiAgICAgIHZhciA9PSAyIH4gIjQtQ2F0ZWdvcmllcyAoTm9uLVNpZ25hbCkiLAogICAgICB2YXIgPT0gMyB+ICIxMC1DYXRlZ29yaWVzIChOb24tU2lnbmFsKSIsCiAgICAgIHZhciA9PSA0IH4gIjIwLUNhdGVnb3JpZXMgKE5vbi1TaWduYWwpIgogICAgKSAlPiUKICAgICAgZmFjdG9yKGxldmVscyA9IGMoIk5vcm1hbCAoTm9uLVNpZ25hbCkiLAogICAgICAgICAgICAgICAgICAgICAgICAiMjAtQ2F0ZWdvcmllcyAoTm9uLVNpZ25hbCkiLAogICAgICAgICAgICAgICAgICAgICAgICAiMTAtQ2F0ZWdvcmllcyAoTm9uLVNpZ25hbCkiLAogICAgICAgICAgICAgICAgICAgICAgICAiNC1DYXRlZ29yaWVzIChOb24tU2lnbmFsKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJCZXJub3VsbGkgKFNpZ25hbCkiKSkKICApCgpzaW1fdHlwZXMgPC0gdW5pcXVlKHBsdF9kZiR0eXBlKQpwbHRfbHMgPC0gbGlzdCgpCmZvciAoaWR4IGluIDE6bGVuZ3RoKHNpbV90eXBlcykpIHsKICBzaW1fdHlwZSA8LSBzaW1fdHlwZXNbaWR4XQogIHBsdCA8LSBwbHRfZGYgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKHR5cGUgPT0gISFzaW1fdHlwZSkgJT4lCiAgICBnZ3Bsb3QyOjpnZ3Bsb3QoKSArCiAgICBnZ3Bsb3QyOjphZXMoeCA9IG5fbmFtZSwgeSA9IC5tZWFuLCBjb2xvciA9IGFzLmZhY3Rvcih2YXIpKSArCiAgICBnZ3Bsb3QyOjpnZW9tX2xpbmUoc2l6ZSA9IDEpICsKICAgIGdncGxvdDI6OmxhYnMoCiAgICAgIHggPSAiU2FtcGxlIFNpemUiLAogICAgICB5ID0gIlBlcmNlbnRhZ2Ugb2YgU3BsaXRzIGluIFJGICglKSIsCiAgICAgIGNvbG9yID0gIkZlYXR1cmUiLCAKICAgICAgdGl0bGUgPSBzaW1fdHlwZQogICAgKSArCiAgICBnZ3Bsb3QyOjpndWlkZXMoZmlsbCA9ICJub25lIiwgbGluZXR5cGUgPSAibm9uZSIpICsKICAgIHZ0aGVtZXM6OnRoZW1lX3Ztb2Rlcm4oCiAgICAgIHNpemVfcHJlc2V0ID0gIm1lZGl1bSIsIGJnX2NvbG9yID0gIndoaXRlIiwgZ3JpZF9jb2xvciA9ICJ3aGl0ZSIsCiAgICAgIGF4aXMudGlja3MgPSBnZ3Bsb3QyOjplbGVtZW50X2xpbmUoc2l6ZSA9IGdncGxvdDI6OnJlbCgyKSwgY29sb3VyID0gImJsYWNrIiksCiAgICAgIGF4aXMudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICBheGlzLnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxOCwgZmFjZSA9ICJwbGFpbiIpLAogICAgICBsZWdlbmQudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICBsZWdlbmQudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgICAgcGxvdC50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KQogICAgKQogIGlmIChpZHggIT0gMSkgewogICAgcGx0IDwtIHBsdCArCiAgICAgIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSkKICB9CiAgcGx0X2xzW1tpZHhdXSA8LSBwbHQKfQoKcGx0X3dpZGUgPC0gcGF0Y2h3b3JrOjp3cmFwX3Bsb3RzKHBsdF9scywgZ3VpZGVzID0gImNvbGxlY3QiLCBucm93ID0gMSkKaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICBnZ3Bsb3QyOjpnZ3NhdmUocGx0X3dpZGUsIGZpbGVuYW1lID0gZmlsZS5wYXRoKGZpZ3VyZXNfZGlyLCAiZW50cm9weV9zaW1zX251bV9zcGxpdHMucGRmIiksCiAgICAgICAgICAgICAgICAgICMgaGVpZ2h0ID0gZmlnX2hlaWdodCAqIC41NSwgd2lkdGggPSBmaWdfd2lkdGggKiAuMjUgKiBsZW5ndGgoc2hvd19tZXRob2RzKSkKICAgICAgICAgICAgICAgICAgd2lkdGggPSBmaWdfd2lkdGggKiAxLjEsIGhlaWdodCA9IGZpZ19oZWlnaHQgKiAuNjUpCn0gZWxzZSB7CiAgdnRoZW1lczo6c3ViY2h1bmtpZnkoCiAgICBwbHRfd2lkZSwgaSA9IGNodW5rX2lkeCwgZmlnX2hlaWdodCA9IGZpZ19oZWlnaHQsIGZpZ193aWR0aCA9IGZpZ193aWR0aCAqIDEuMwogICkKICBjaHVua19pZHggPC0gY2h1bmtfaWR4ICsgMQp9CgpgYGAKCiMjIEFwcGVuZGl4IEZpZ3VyZXMgey50YWJzZXQgLnRhYnNldC1waWxscyAudGFic2V0LXNxdWFyZX0KCmBgYHtyIGV2YWwgPSBUUlVFLCByZXN1bHRzID0gImFzaXMifQojIyMjIEVudHJvcHkgUmVncmVzc2lvbiBSZXN1bHRzICMjIyMKbWFudWFsX2NvbG9yX3BhbGV0dGUgPC0gcmV2KGMoImJsYWNrIiwgImJsYWNrIiwgIiM3MWJlYjciKSkKc2hvd19tZXRob2RzIDwtIHJldihjKCJHTURJIiwgIkdNRElfaW5iYWciLCAiTURJIikpCm1ldGhvZF9sYWJlbHMgPC0gcmV2KGMoIk1ESSsgKHJpZGdlLCBMT08pIiwgIk1ESSsgKHJpZGdlLCBpbi1iYWcpIiwgIk1ESSIpKQphbHBoYV92YWx1ZXMgPC0gcmV2KGMoMSwgMSwgcmVwKDEsIGxlbmd0aChtZXRob2RfbGFiZWxzKSAtIDIpKSkKbGluZXR5cGVfdmFsdWVzIDwtIGMoInNvbGlkIiwgImRhc2hlZCIsICJzb2xpZCIpCnlfbGltaXRzIDwtIGMoMSwgNSkKCm1ldHJpY19uYW1lIDwtICJBVVJPQyIKc2ltX25hbWUgPC0gImdtZGkubWRpX2JpYXNfc2ltcy5lbnRyb3B5X3NpbXMubGluZWFyX2RncCIKZm5hbWUgPC0gZmlsZS5wYXRoKAogIHJlc3VsdHNfZGlyLCAKICBzaW1fbmFtZSwKICAidmFyeWluZ19oZXJpdGFiaWxpdHlfbiIsCiAgc3ByaW50Zigic2VlZCVzIiwgc2VlZCksCiAgInJlc3VsdHMuY3N2IgopCgojIyMjIEVudHJvcHkgUmVncmVzc2lvbiBBdmcgUmFuayAjIyMjCnJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoZm5hbWUpICU+JQogIGRwbHlyOjpmaWx0ZXIoaGVyaXRhYmlsaXR5X25hbWUgPT0gMC4xKQoKY3VzdG9tX2dyb3VwX2Z1biA8LSBmdW5jdGlvbih2YXIpIHZhcgoKcGx0X2Jhc2UgPC0gcGxvdF9wZXJ0dXJiYXRpb25fc3RhYmlsaXR5KAogIHJlc3VsdHMsCiAgZmFjZXRfcm93cyA9ICJoZXJpdGFiaWxpdHlfbmFtZSIsCiAgZmFjZXRfY29scyA9ICJuX25hbWUiLCAKICBncm91cF9mdW4gPSBjdXN0b21fZ3JvdXBfZnVuLCAKICBwYXJhbV9uYW1lID0gTlVMTCwKICBwbG90X3R5cGVzID0gImVycmJhciIsCiAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMKKQoKcGx0X2RmIDwtIHBsdF9iYXNlJGFnZ1tbMV1dJGRhdGEKbnJlcHMgPC0gbGVuZ3RoKHVuaXF1ZShyZXN1bHRzJHJlcCkpCgpwbHRfcmVncmVzc2lvbiA8LSBwbHRfZGYgJT4lCiAgZHBseXI6OmZpbHRlcihncm91cCA9PSAwKSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBuX25hbWUsIHkgPSAubWVhbiwgY29sb3IgPSBmaSwgYWxwaGEgPSBmaSwgbGluZXR5cGUgPSBmaSkgKwogIGdncGxvdDI6Omdlb21fbGluZShzaXplID0gbGluZV9zaXplKSArCiAgZ2dwbG90Mjo6bGFicygKICAgIHggPSAiU2FtcGxlIFNpemUiLCAKICAgIHkgPSBleHByZXNzaW9uKCJBdmVyYWdlIFJhbmsgb2YgIipYWzFdKSwgCiAgICBjb2xvciA9ICJNZXRob2QiLAogICAgbGluZXR5cGUgPSAiTWV0aG9kIiwKICAgIHRpdGxlID0gIlJlZ3Jlc3Npb24iCiAgKSArCiAgZ2dwbG90Mjo6Z3VpZGVzKGZpbGwgPSAibm9uZSIsIGFscGhhID0gIm5vbmUiKSArCiAgZ2dwbG90Mjo6c2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGdncGxvdDI6Omd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkpICsKICBnZ3Bsb3QyOjpzY2FsZV9hbHBoYV9tYW51YWwodmFsdWVzID0gYWxwaGFfdmFsdWVzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBnZ3Bsb3QyOjpndWlkZV9sZWdlbmQocmV2ZXJzZSA9IFRSVUUpKSArCiAgZ2dwbG90Mjo6c2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcyA9IGxpbmV0eXBlX3ZhbHVlcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ2dwbG90Mjo6Z3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSkgKwogIGdncGxvdDI6OmNvb3JkX2NhcnRlc2lhbih5bGltID0geV9saW1pdHMpICsKICB2dGhlbWVzOjp0aGVtZV92bW9kZXJuKAogICAgc2l6ZV9wcmVzZXQgPSAibWVkaXVtIiwgYmdfY29sb3IgPSAid2hpdGUiLCBncmlkX2NvbG9yID0gIndoaXRlIiwKICAgIGF4aXMudGlja3MgPSBnZ3Bsb3QyOjplbGVtZW50X2xpbmUoc2l6ZSA9IGdncGxvdDI6OnJlbCgyKSwgY29sb3VyID0gImJsYWNrIiksCiAgICBheGlzLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgIGF4aXMudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4LCBmYWNlID0gInBsYWluIiksCiAgICBsZWdlbmQudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgbGVnZW5kLnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxOCksCiAgICBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpLAogICAgbGVnZW5kLmtleS53aWR0aCA9IGdncGxvdDI6OnVuaXQoMSwgImNtIikKICApCgojIyMjIEVudHJvcHkgQ2xhc3NpZmljYXRpb24gUmVzdWx0cyAjIyMjCm1hbnVhbF9jb2xvcl9wYWxldHRlIDwtIHJldihjKCJibGFjayIsICJibGFjayIsICIjOUI1REZGIiwgIiM5QjVERkYiLCAiIzcxYmViNyIpKQpzaG93X21ldGhvZHMgPC0gcmV2KGMoIkdNRElfcmlkZ2UiLCAiR01ESV9yaWRnZV9pbmJhZyIsICJHTURJX2xvZ2lzdGljX2xvZ2xvc3MiLCAiR01ESV9sb2dpc3RpY19sb2dsb3NzX2luYmFnIiwgIk1ESSIpKQptZXRob2RfbGFiZWxzIDwtIHJldihjKCJNREkrIChyaWRnZSwgTE9PKSIsICJNREkrIChyaWRnZSwgaW4tYmFnKSIsICJNREkrIChsb2dpc3RpYywgTE9PKSIsICJNREkrIChsb2dpc3RpYywgaW4tYmFnKSIsICJNREkiKSkKYWxwaGFfdmFsdWVzIDwtIHJldihjKDEsIDEsIDEsIDEsIHJlcCgxLCBsZW5ndGgobWV0aG9kX2xhYmVscykgLSA0KSkpCmxpbmV0eXBlX3ZhbHVlcyA8LSBjKCJzb2xpZCIsICJkYXNoZWQiLCAic29saWQiLCAiZGFzaGVkIiwgInNvbGlkIikKCm1ldHJpY19uYW1lIDwtICJBVVJPQyIKc2ltX25hbWUgPC0gImdtZGkubWRpX2JpYXNfc2ltcy5lbnRyb3B5X3NpbXMubG9naXN0aWNfZGdwIgpmbmFtZSA8LSBmaWxlLnBhdGgoCiAgcmVzdWx0c19kaXIsIAogIHNpbV9uYW1lLAogICJ2YXJ5aW5nX2NfbiIsCiAgc3ByaW50Zigic2VlZCVzIiwgc2VlZCksCiAgInJlc3VsdHMuY3N2IgopCgojIyMjIEVudHJvcHkgQ2xhc3NpZmljYXRpb24gQXZnIFJhbmsgIyMjIwpyZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKGZuYW1lKQoKY3VzdG9tX2dyb3VwX2Z1biA8LSBmdW5jdGlvbih2YXIpIHZhcgoKcGx0X2Jhc2UgPC0gcGxvdF9wZXJ0dXJiYXRpb25fc3RhYmlsaXR5KAogIHJlc3VsdHMsCiAgZmFjZXRfcm93cyA9ICJjX25hbWUiLAogIGZhY2V0X2NvbHMgPSAibl9uYW1lIiwgCiAgZ3JvdXBfZnVuID0gY3VzdG9tX2dyb3VwX2Z1biwgCiAgcGFyYW1fbmFtZSA9IE5VTEwsCiAgcGxvdF90eXBlcyA9ICJlcnJiYXIiLAogIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzCikKCnBsdF9kZiA8LSBwbHRfYmFzZSRhZ2dbWzFdXSRkYXRhCm5yZXBzIDwtIGxlbmd0aCh1bmlxdWUocmVzdWx0cyRyZXApKQoKcGx0X2NsYXNzaWZpY2F0aW9uIDwtIHBsdF9kZiAlPiUKICBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDApICU+JQogIGdncGxvdDI6OmdncGxvdCgpICsKICBnZ3Bsb3QyOjphZXMoeCA9IG5fbmFtZSwgeSA9IC5tZWFuLCBjb2xvciA9IGZpLCBhbHBoYSA9IGZpLCBsaW5ldHlwZSA9IGZpKSArCiAgZ2dwbG90Mjo6Z2VvbV9saW5lKHNpemUgPSBsaW5lX3NpemUpICsKICBnZ3Bsb3QyOjpsYWJzKAogICAgeCA9ICJTYW1wbGUgU2l6ZSIsIAogICAgeSA9IGV4cHJlc3Npb24oIkF2ZXJhZ2UgUmFuayBvZiAiKlhbMV0pLCAKICAgIGNvbG9yID0gIk1ldGhvZCIsCiAgICBsaW5ldHlwZSA9ICJNZXRob2QiLAogICAgdGl0bGUgPSAiQ2xhc3NpZmljYXRpb24iCiAgKSArCiAgZ2dwbG90Mjo6Z3VpZGVzKGZpbGwgPSAibm9uZSIsIGFscGhhID0gIm5vbmUiKSArCiAgZ2dwbG90Mjo6c2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGdncGxvdDI6Omd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkpICsKICBnZ3Bsb3QyOjpzY2FsZV9hbHBoYV9tYW51YWwodmFsdWVzID0gYWxwaGFfdmFsdWVzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBnZ3Bsb3QyOjpndWlkZV9sZWdlbmQocmV2ZXJzZSA9IFRSVUUpKSArCiAgZ2dwbG90Mjo6c2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcyA9IGxpbmV0eXBlX3ZhbHVlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBnZ3Bsb3QyOjpndWlkZV9sZWdlbmQocmV2ZXJzZSA9IFRSVUUpKSArCiAgZ2dwbG90Mjo6Y29vcmRfY2FydGVzaWFuKAogICAgeWxpbSA9IHlfbGltaXRzCiAgKSArCiAgdnRoZW1lczo6dGhlbWVfdm1vZGVybigKICAgIHNpemVfcHJlc2V0ID0gIm1lZGl1bSIsIGJnX2NvbG9yID0gIndoaXRlIiwgZ3JpZF9jb2xvciA9ICJ3aGl0ZSIsCiAgICBheGlzLnRpY2tzID0gZ2dwbG90Mjo6ZWxlbWVudF9saW5lKHNpemUgPSBnZ3Bsb3QyOjpyZWwoMiksIGNvbG91ciA9ICJibGFjayIpLAogICAgYXhpcy50ZXh0ID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICBheGlzLnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxOCwgZmFjZSA9ICJwbGFpbiIpLAogICAgbGVnZW5kLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgIGxlZ2VuZC50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTgpLAogICAgcGxvdC50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KSwKICAgIGxlZ2VuZC5rZXkud2lkdGggPSBnZ3Bsb3QyOjp1bml0KDEsICJjbSIpCiAgKQoKIyMjIyBTaG93IEF2ZyBSYW5rIFBsb3QgIyMjIwpjYXQoIlxuXG4jIyMgQXZlcmFnZSBSYW5rIFxuXG4iKQpwbHQgPC0gcGx0X3JlZ3Jlc3Npb24gKyBwbHRfY2xhc3NpZmljYXRpb24KaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICBnZ3Bsb3QyOjpnZ3NhdmUocGx0LCBmaWxlbmFtZSA9IGZpbGUucGF0aChmaWd1cmVzX2RpciwgImVudHJvcHlfc2ltc19hcHBlbmRpeC5wZGYiKSwgCiAgICAgICAgICAgICAgICAgIHdpZHRoID0gZmlnX3dpZHRoICogMS4zNSwgaGVpZ2h0ID0gZmlnX2hlaWdodCAqIC42NSkKfSBlbHNlIHsKICB2dGhlbWVzOjpzdWJjaHVua2lmeSgKICAgIHBsdCwgaSA9IGNodW5rX2lkeCwgZmlnX2hlaWdodCA9IGZpZ19oZWlnaHQgKiAuNywgZmlnX3dpZHRoID0gZmlnX3dpZHRoICogMS4zCiAgKQogIGNodW5rX2lkeCA8LSBjaHVua19pZHggKyAxCn0KCmBgYAoKCiMgQ0NMRSBDYXNlIFN0dWR5IHsudGFic2V0IC50YWJzZXQtcGlsbHMgLnRhYnNldC1zcXVhcmV9CgpgYGB7ciBldmFsID0gVFJVRSwgcmVzdWx0cyA9ICJhc2lzIn0KbWFudWFsX2NvbG9yX3BhbGV0dGUgPC0gYygiYmxhY2siLCAib3JhbmdlIiwgIiM3MWJlYjciLCAiIzIxOGExZSIsICIjY2MzMzk5IikKc2hvd19tZXRob2RzIDwtIGMoIkdNREkiLCAiTURBIiwgIk1ESSIsICJNREktb29iIiwgIlRyZWVTSEFQIikKbWV0aG9kX2xhYmVscyA8LSBjKCJNREkrIChyaWRnZSkiLCAiTURBIiwgIk1ESSIsICJNREktb29iIiwgIlRyZWVTSEFQIikKCmZwYXRoIDwtICJnbWRpLnJlYWxfZGF0YV9jYXNlX3N0dWR5LmNjbGVfcm5hc2VxX3JlZ3Jlc3Npb24tIgpmbmFtZSA8LSBmaWxlLnBhdGgoCiAgcmVzdWx0c19kaXIsIAogIGZwYXRoLAogIHNwcmludGYoInNlZWQlcyIsIHNlZWQpLAogICJyZXN1bHRzLmNzdiIKKQpYIDwtIGRhdGEudGFibGU6OmZyZWFkKCIvZ2xvYmFsL3NjcmF0Y2gvdXNlcnMvdGlmZmFueXRhbmcvZmVhdHVyZV9pbXBvcnRhbmNlL2RhdGEvWF9jY2xlX3JuYXNlcV9jbGVhbmVkX2ZpbHRlcmVkNTAwMC5jc3YiKQpYX2NvbHVtbnMgPC0gY29sbmFtZXMoWCkKcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChmbmFtZSkKCm91dCA8LSBwbG90X3RvcF9zdGFiaWxpdHkoCiAgcmVzdWx0cywKICBncm91cF9pZCA9ICJ5X3Rhc2siLAogIHRvcF9yID0gMTAsCiAgc2hvd19tYXhfZmVhdHVyZXMgPSA1LAogIHZhcm5hbWVzID0gY29sbmFtZXMoWCksCiAgYmFzZV9tZXRob2QgPSAiTURJKyAocmlkZ2UpIiwKICByZXR1cm5fZGYgPSBUUlVFLAogIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gcmV2KG1hbnVhbF9jb2xvcl9wYWxldHRlKSwKICBzaG93X21ldGhvZHMgPSByZXYoc2hvd19tZXRob2RzKSwKICBtZXRob2RfbGFiZWxzID0gcmV2KG1ldGhvZF9sYWJlbHMpCikKCnJhbmtpbmdfZGYgPC0gb3V0JHJhbmtpbmdzCnN0YWJpbGl0eV9kZiA8LSBvdXQkc3RhYmlsaXR5CnBsdF9scyA8LSBvdXQkcGxvdF9scwoKIyBnZXQgZ2VuZSBuYW1lcyBpbnN0ZWFkIG9mIEVOU0cgaWRzCmxpYnJhcnkoYmlvbWFSdCkKZW5zZW1ibCA8LSB1c2VNYXJ0KCJlbnNlbWJsIiwgZGF0YXNldCA9ICJoc2FwaWVuc19nZW5lX2Vuc2VtYmwiKQp2YXJuYW1lcyA8LSBnZXRCTSgKICBhdHRyaWJ1dGVzID0gYygiZW5zZW1ibF9nZW5lX2lkIiwgImhnbmNfc3ltYm9sIiksIAogIGZpbHRlcnMgPSAiZW5zZW1ibF9nZW5lX2lkIiwgCiAgdmFsdWVzID0gc3RyaW5ncjo6c3RyX3JlbW92ZShjb2xuYW1lcyhYKSwgIlxcLlteXFwuXSskIiksIAogIG1hcnQgPSBlbnNlbWJsCikgJT4lCiAgZHBseXI6OmZpbHRlcihoZ25jX3N5bWJvbCAhPSAiIikgJT4lCiAgZHBseXI6OmJpbmRfcm93cygKICAgIGRhdGEuZnJhbWUoZW5zZW1ibF9nZW5lX2lkID0gc3RyaW5ncjo6c3RyX3JlbW92ZShjb2xuYW1lcyhYKSwgIlxcLlteXFwuXSskIiksCiAgICAgICAgICAgICAgIGhnbmNfc3ltYm9sID0gc3RyaW5ncjo6c3RyX3JlbW92ZShjb2xuYW1lcyhYKSwgIlxcLlteXFwuXSskIikpCiAgKSAlPiUKICBkcGx5cjo6ZGlzdGluY3QoZW5zZW1ibF9nZW5lX2lkLCAua2VlcF9hbGwgPSBUUlVFKQoKIyBnZXQgdG9wIDUgZ2VuZXMKdG9wX2dlbmVzIDwtIHJhbmtpbmdfZGYgJT4lCiAgZHBseXI6Omdyb3VwX2J5KHlfdGFzaywgZmksIHZhcikgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShtZWFuX3JhbmsgPSBtZWFuKHJhbmspKSAlPiUKICBkcGx5cjo6dW5ncm91cCgpICU+JQogIGRwbHlyOjphcnJhbmdlKHlfdGFzaywgbWVhbl9yYW5rKSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoeV90YXNrLCBmaSkgJT4lCiAgZHBseXI6Om11dGF0ZShyYW5rID0gMTpkcGx5cjo6bigpKSAlPiUKICBkcGx5cjo6dW5ncm91cCgpCgp0b3BfZ2VuZXNfdGFibGUgPC0gdG9wX2dlbmVzICU+JQogIGRwbHlyOjpmaWx0ZXIocmFuayA8PSA1KSAlPiUKICBkcGx5cjo6bGVmdF9qb2luKAogICAgeSA9IGRhdGEuZnJhbWUodmFyID0gMDoobmNvbChYKSAtIDEpLCAKICAgICAgICAgICAgICAgICAgIGVuc2VtYmxfZ2VuZV9pZCA9IHN0cmluZ3I6OnN0cl9yZW1vdmUoY29sbmFtZXMoWCksICJcXC5bXlxcLl0rJCIpKSwKICAgIGJ5ID0gInZhciIKICApICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4oCiAgICB5ID0gdmFybmFtZXMsIGJ5ID0gImVuc2VtYmxfZ2VuZV9pZCIKICApICU+JQogIGRwbHlyOjptdXRhdGUoCiAgICB2YWx1ZSA9IHNwcmludGYoIiVzICglcykiLCBoZ25jX3N5bWJvbCwgcm91bmQobWVhbl9yYW5rLCAyKSkKICApICU+JQogIHRpZHlyOjpwaXZvdF93aWRlcigKICAgIGlkX2NvbHMgPSBjKHlfdGFzaywgcmFuayksIAogICAgbmFtZXNfZnJvbSA9IGZpLCAKICAgIHZhbHVlc19mcm9tID0gdmFsdWUKICApICU+JQogIGRwbHlyOjpyZW5hbWUoCiAgICAiRHJ1ZyIgPSAieV90YXNrIiwKICAgICJSYW5rIiA9ICJyYW5rIgogICkKCiMgd3JpdGUuY3N2KAojICAgdG9wX2dlbmVzX3RhYmxlLCBmaWxlLnBhdGgodGFibGVzX2RpciwgImNjbGVfcm5hc2VxX3RvcF9nZW5lc190YWJsZS5jc3YiKSwKIyAgIHJvdy5uYW1lcyA9IEZBTFNFLCBxdW90ZSA9IEZBTFNFCiMgKQoKIyBnZXQgIyBnZW5lcyB3aXRoIHBlcmZlY3Qgc3RhYmlsaXR5CnN0YWJsZV9nZW5lc19rYWJsZSA8LSBzdGFiaWxpdHlfZGYgJT4lCiAgZHBseXI6Omdyb3VwX2J5KGZpLCB5X3Rhc2spICU+JQogIGRwbHlyOjpzdW1tYXJpc2Uoc3RhYmlsaXR5XzEgPSBzdW0oc3RhYmlsaXR5X3Njb3JlID09IDEpKSAlPiUKICB0aWR5cjo6cGl2b3Rfd2lkZXIoaWRfY29scyA9IGZpLCBuYW1lc19mcm9tID0geV90YXNrLCB2YWx1ZXNfZnJvbSA9IHN0YWJpbGl0eV8xKSAlPiUKICBkcGx5cjo6dW5ncm91cCgpICU+JQogIGFzLmRhdGEuZnJhbWUoKQoKZm9yIChwbHRfaWQgaW4gbmFtZXMocGx0X2xzKSkgewogIGNhdChzcHJpbnRmKCJcblxuIyMgJXMgXG5cbiIsIHBsdF9pZCkpCiAgcGx0IDwtIHBsdF9sc1tbcGx0X2lkXV0KICBpZiAocGx0X2lkID09ICJTdW1tYXJ5IikgewogICAgcGx0IDwtIHBsdCArIGdncGxvdDI6OmxhYnMoeSA9ICJEcnVnIikKICAgIGlmIChwYXJhbXMkZm9yX3BhcGVyKSB7CiAgICAgIGdncGxvdDI6Omdnc2F2ZShwbHQsIGZpbGVuYW1lID0gZmlsZS5wYXRoKGZpZ3VyZXNfZGlyLCAiY2NsZV9ybmFzZXFfc3RhYmlsaXR5X3RvcDEwLnBkZiIpLCAKICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gZmlnX3dpZHRoICogMS41LCBoZWlnaHQgPSBmaWdfaGVpZ2h0ICogMS4xKQogICAgfSBlbHNlIHsKICAgICAgdnRoZW1lczo6c3ViY2h1bmtpZnkoCiAgICAgICAgcGx0LCBpID0gc3ByaW50ZigiJXMtJXMiLCBmcGF0aCwgcGx0X2lkKSwgCiAgICAgICAgZmlnX2hlaWdodCA9IGZpZ19oZWlnaHQsIGZpZ193aWR0aCA9IGZpZ193aWR0aCAqIDEuMwogICAgICApCiAgICB9CiAgICAKICAgIGNhdCgiXG5cbiMjIFRhYmxlIG9mIFRvcCBHZW5lcyBcblxuIikKICAgIGlmIChwYXJhbXMkZm9yX3BhcGVyKSB7CiAgICAgIHRvcF9nZW5lc19rYWJsZSA8LSB0b3BfZ2VuZXNfdGFibGUgJT4lCiAgICAgICAgZHBseXI6OmZpbHRlcihSYW5rIDw9IDUpICU+JQogICAgICAgIGRwbHlyOjpzZWxlY3QoLURydWcpICU+JQogICAgICAgIGRwbHlyOjpyZW5hbWUoIiAiID0gIlJhbmsiKSAlPiUKICAgICAgICB2dGhlbWVzOjpwcmV0dHlfa2FibGUoZm9ybWF0ID0gImxhdGV4IiwgbG9uZ3RhYmxlID0gVFJVRSkgJT4lCiAgICAgICAga2FibGVFeHRyYTo6a2FibGVfc3R5bGluZyhsYXRleF9vcHRpb25zID0gInJlcGVhdF9oZWFkZXIiKSAlPiUKICAgICAgICAjIGthYmxlRXh0cmE6OmNvbGxhcHNlX3Jvd3MoY29sdW1ucyA9IDEsIHZhbGlnbiA9ICJtaWRkbGUiKQogICAgICAgIGthYmxlRXh0cmE6OnBhY2tfcm93cygKICAgICAgICAgIGluZGV4ID0gcmVwKDUsIDI0KSAlPiUgc2V0TmFtZXModW5pcXVlKHRvcF9nZW5lc190YWJsZSREcnVnKSkKICAgICAgICApCiAgICB9IGVsc2UgewogICAgICB0b3BfZ2VuZXNfa2FibGUgPC0gdG9wX2dlbmVzX3RhYmxlICU+JQogICAgICAgIGRwbHlyOjpmaWx0ZXIoUmFuayA8PSA1KSAlPiUKICAgICAgICBkcGx5cjo6c2VsZWN0KC1EcnVnKSAlPiUKICAgICAgICBkcGx5cjo6cmVuYW1lKCIgIiA9ICJSYW5rIikgJT4lCiAgICAgICAgdnRoZW1lczo6cHJldHR5X2thYmxlKCkgJT4lCiAgICAgICAga2FibGVFeHRyYTo6a2FibGVfc3R5bGluZyhsYXRleF9vcHRpb25zID0gInJlcGVhdF9oZWFkZXIiKSAlPiUKICAgICAgICAjIGthYmxlRXh0cmE6OmNvbGxhcHNlX3Jvd3MoY29sdW1ucyA9IDEsIHZhbGlnbiA9ICJtaWRkbGUiKQogICAgICAgIGthYmxlRXh0cmE6OnBhY2tfcm93cygKICAgICAgICAgIGluZGV4ID0gcmVwKDUsIDI0KSAlPiUgc2V0TmFtZXModW5pcXVlKHRvcF9nZW5lc190YWJsZSREcnVnKSkKICAgICAgICApCiAgICAgIHZ0aGVtZXM6OnN1YmNodW5raWZ5KAogICAgICAgIHRvcF9nZW5lc19rYWJsZSwgaSA9IHNwcmludGYoIiVzLXRhYmxlIiwgZnBhdGgpCiAgICAgICkKICAgIH0KICB9IGVsc2UgaWYgKCFwYXJhbXMkZm9yX3BhcGVyKSB7CiAgICB2dGhlbWVzOjpzdWJjaHVua2lmeSgKICAgICAgcGxvdF9mdW4ocGx0KSwgaSA9IHNwcmludGYoIiVzLSVzIiwgZnBhdGgsIHBsdF9pZCksIAogICAgICBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCwgZmlnX3dpZHRoID0gZmlnX3dpZHRoICogMS4zCiAgICApCiAgfQp9CmBgYAoKYGBge3IgZXZhbCA9IFRSVUUsIHJlc3VsdHMgPSAiYXNpcyJ9CmlmIChwYXJhbXMkZm9yX3BhcGVyKSB7CiAgbWFudWFsX2NvbG9yX3BhbGV0dGVfZnVsbCA8LSBjKCJibGFjayIsICJvcmFuZ2UiLCAiIzcxYmViNyIsICIjMjE4YTFlIiwgIiNjYzMzOTkiKQogIHNob3dfbWV0aG9kc19mdWxsIDwtIGMoIkdNREkiLCAiTURBIiwgIk1ESSIsICJNREktb29iIiwgIlRyZWVTSEFQIikKICBtZXRob2RfbGFiZWxzX2Z1bGwgPC0gYygiTURJKyAocmlkZ2UpIiwgIk1EQSIsICJNREkiLCAiTURJLW9vYiIsICJUcmVlU0hBUCIpCiAga2VlcF9tZXRob2RzX2xpc3QgPC0gbGlzdCgKICAgIGFsbCA9IGMoIkdNREkiLCAiTURBIiwgIk1ESSIsICJNREktb29iIiwgIlRyZWVTSEFQIiksCiAgICBub19tZGlvb2IgPSBjKCJHTURJIiwgIk1EQSIsICJNREkiLCAiVHJlZVNIQVAiKSwKICAgIHpvb20gPSBjKCJHTURJIiwgIk1ESSIsICJUcmVlU0hBUCIpCiAgKQogIAogIGZwYXRoIDwtICJnbWRpLnJlYWxfZGF0YV9jYXNlX3N0dWR5LmNjbGVfcm5hc2VxX3JlZ3Jlc3Npb24tIgogIGZuYW1lIDwtIGZpbGUucGF0aCgKICAgIHJlc3VsdHNfZGlyLCAKICAgIGZwYXRoLAogICAgc3ByaW50Zigic2VlZCVzIiwgc2VlZCksCiAgICAicmVzdWx0cy5jc3YiCiAgKQogIFggPC0gZGF0YS50YWJsZTo6ZnJlYWQoIi9nbG9iYWwvc2NyYXRjaC91c2Vycy90aWZmYW55dGFuZy9mZWF0dXJlX2ltcG9ydGFuY2UvZGF0YS9YX2NjbGVfcm5hc2VxX2NsZWFuZWRfZmlsdGVyZWQ1MDAwLmNzdiIpCiAgcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChmbmFtZSkKICAKICBmb3IgKGlkIGluIG5hbWVzKGtlZXBfbWV0aG9kc19saXN0KSkgewogICAga2VlcF9tZXRob2RzIDwtIGtlZXBfbWV0aG9kc19saXN0W1tpZF1dCiAgICBtYW51YWxfY29sb3JfcGFsZXR0ZSA8LSBtYW51YWxfY29sb3JfcGFsZXR0ZV9mdWxsW3Nob3dfbWV0aG9kc19mdWxsICVpbiUga2VlcF9tZXRob2RzXQogICAgc2hvd19tZXRob2RzIDwtIHNob3dfbWV0aG9kc19mdWxsW3Nob3dfbWV0aG9kc19mdWxsICVpbiUga2VlcF9tZXRob2RzXQogICAgbWV0aG9kX2xhYmVscyA8LSBtZXRob2RfbGFiZWxzX2Z1bGxbc2hvd19tZXRob2RzX2Z1bGwgJWluJSBrZWVwX21ldGhvZHNdCiAgICAKICAgIHBsdF9scyA8LSBwbG90X3RvcF9zdGFiaWxpdHkoCiAgICAgIHJlc3VsdHMsCiAgICAgIGdyb3VwX2lkID0gInlfdGFzayIsCiAgICAgIHRvcF9yID0gMTAsCiAgICAgIHNob3dfbWF4X2ZlYXR1cmVzID0gNSwKICAgICAgdmFybmFtZXMgPSBjb2xuYW1lcyhYKSwKICAgICAgYmFzZV9tZXRob2QgPSAiR01ESSIsCiAgICAgIHJldHVybl9kZiA9IEZBTFNFLAogICAgICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgICAgIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzCiAgICApCiAgICAKICAgIGlmIChpZCA9PSAibm9fbWRpb29iIikgewogICAgICBrZWVwX2RydWdzIDwtIGMoIlBhbm9iaW5vc3RhdCIsICJMYXBhdGluaWIiLCAiVEFFNjg0IiwgIkwtNjg1NDU4IikKICAgICAgc21hbGxfcGx0X2xzIDwtIGxpc3QoKQogICAgICBmb3IgKGRydWcgaW4ga2VlcF9kcnVncykgewogICAgICAgIHBsdCA8LSBwbHRfbHNbW2RydWddXQogICAgICAgIGlmIChkcnVnICE9IGtlZXBfZHJ1Z3NbMV0pIHsKICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgfQogICAgICAgIHNtYWxsX3BsdF9sc1tbZHJ1Z11dIDwtIHBsdAogICAgICB9CiAgICAgIHNtYWxsX3BsdF9sc1tbMV1dICsgc21hbGxfcGx0X2xzW1syXV0gKyBzbWFsbF9wbHRfbHNbWzNdXSArIHNtYWxsX3BsdF9sc1tbNF1dICsKICAgICAgICBwYXRjaHdvcms6OnBsb3RfbGF5b3V0KG5yb3cgPSAxLCBuY29sID0gNCwgZ3VpZGVzID0gImNvbGxlY3QiKQogICAgICBwbHQgPC0gcGF0Y2h3b3JrOjp3cmFwX3Bsb3RzKHNtYWxsX3BsdF9scywgbnJvdyA9IDEsIG5jb2wgPSA0LCBndWlkZXMgPSAiY29sbGVjdCIpICYKICAgICAgICBnZ3Bsb3QyOjp0aGVtZSgKICAgICAgICAgIHBsb3QudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLAogICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGdncGxvdDI6OmVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiksCiAgICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZ2dwbG90Mjo6ZWxlbWVudF9saW5lKGNvbG9yID0gImdyZXk5NSIsIHNpemUgPSBnZ3Bsb3QyOjpyZWwoMC4yNSkpCiAgICAgICAgKQogICAgICBnZ3Bsb3QyOjpnZ3NhdmUocGx0LCBmaWxlbmFtZSA9IGZpbGUucGF0aChmaWd1cmVzX2RpciwgImNjbGVfcm5hc2VxX3N0YWJpbGl0eV9zZWxlY3RfZmVhdHVyZXMucGRmIiksCiAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IGZpZ193aWR0aCAqIDEsIGhlaWdodCA9IGZpZ19oZWlnaHQgKiAwLjUpCiAgICB9IGVsc2UgewogICAgICBhbGxfcGx0X2xzIDwtIGxpc3QoKQogICAgICBmb3IgKGlkeCBpbiAxOmxlbmd0aCh1bmlxdWUocmVzdWx0cyR5X3Rhc2spKSkgewogICAgICAgIGRydWcgPC0gc29ydCh1bmlxdWUocmVzdWx0cyR5X3Rhc2spKVtpZHhdCiAgICAgICAgcGx0IDwtIHBsdF9sc1tbZHJ1Z11dCiAgICAgICAgaWYgKChpZHggLSAxKSAlJSA0ICE9IDApIHsKICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgfQogICAgICAgIGlmICgoaWR4IC0gMSkgJS8lIDQgIT0gNSkgewogICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueCA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSkKICAgICAgICB9CiAgICAgICAgYWxsX3BsdF9sc1tbZHJ1Z11dIDwtIHBsdAogICAgICB9CiAgICAgIHBsdCA8LSBwYXRjaHdvcms6OndyYXBfcGxvdHMoYWxsX3BsdF9scywgZ3VpZGVzID0gImNvbGxlY3QiLCBuY29sID0gNCwgbnJvdyA9IDYpICYKICAgICAgICBnZ3Bsb3QyOjp0aGVtZSgKICAgICAgICAgIHBsb3QudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLAogICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGdncGxvdDI6OmVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiksCiAgICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZ2dwbG90Mjo6ZWxlbWVudF9saW5lKGNvbG9yID0gImdyZXk5NSIsIHNpemUgPSBnZ3Bsb3QyOjpyZWwoMC4yNSkpCiAgICAgICAgKQogICAgICBnZ3Bsb3QyOjpnZ3NhdmUocGx0LCAKICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZS5wYXRoKGZpZ3VyZXNfZGlyLCBzcHJpbnRmKCJjY2xlX3JuYXNlcV9zdGFiaWxpdHlfc2VsZWN0X2ZlYXR1cmVzXyVzLnBkZiIsIGlkKSksCiAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IGZpZ193aWR0aCAqIDEsIGhlaWdodCA9IGZpZ19oZWlnaHQgKiAyKQogICAgfQogIH0KfQoKYGBgCgoKIyBUQ0dBIEJSQ0EgQ2FzZSBTdHVkeSB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtc3F1YXJlfQoKYGBge3IgZXZhbCA9IFRSVUUsIHJlc3VsdHMgPSAiYXNpcyJ9Cm1hbnVhbF9jb2xvcl9wYWxldHRlIDwtIGMoImJsYWNrIiwgIiM5QjVERkYiLCAib3JhbmdlIiwgIiM3MWJlYjciLCAiI2NjMzM5OSIpCnNob3dfbWV0aG9kcyA8LSBjKCJHTURJX3JpZGdlIiwgIkdNRElfbG9naXN0aWNfbG9nbG9zcyIsICJNREEiLCAiTURJIiwgIlRyZWVTSEFQIikKbWV0aG9kX2xhYmVscyA8LSBjKCJNREkrIChyaWRnZSkiLCAiTURJKyAobG9naXN0aWMpIiwgIk1EQSIsICJNREkiLCAiVHJlZVNIQVAiKQoKZnBhdGggPC0gImdtZGkucmVhbF9kYXRhX2Nhc2Vfc3R1ZHkudGNnYV9icmNhX2NsYXNzaWZpY2F0aW9uLSIKZm5hbWUgPC0gZmlsZS5wYXRoKAogIHJlc3VsdHNfZGlyLCAKICBmcGF0aCwKICBzcHJpbnRmKCJzZWVkJXMiLCBzZWVkKSwKICAicmVzdWx0cy5jc3YiCikKWCA8LSBkYXRhLnRhYmxlOjpmcmVhZCgiL2dsb2JhbC9zY3JhdGNoL3VzZXJzL3RpZmZhbnl0YW5nL2ZlYXR1cmVfaW1wb3J0YW5jZS9kYXRhL1hfdGNnYV9jbGVhbmVkLmNzdiIpCnJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoZm5hbWUpCm91dCA8LSBwbG90X3RvcF9zdGFiaWxpdHkoCiAgcmVzdWx0cywKICBncm91cF9pZCA9IE5VTEwsCiAgdG9wX3IgPSAxMCwKICBzaG93X21heF9mZWF0dXJlcyA9IDIwLAogIHZhcm5hbWVzID0gY29sbmFtZXMoWCksCiAgYmFzZV9tZXRob2QgPSAiTURJKyAocmlkZ2UpIiwgCiAgZGVzY2VuZGluZ19tZXRob2RzID0gIk1ESSsgKGxvZ2lzdGljKSIsCiAgcmV0dXJuX2RmID0gVFJVRSwKICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscwopCgpyYW5raW5nX2RmIDwtIG91dCRyYW5raW5ncwpzdGFiaWxpdHlfZGYgPC0gb3V0JHN0YWJpbGl0eQpwbHRfbHMgPC0gb3V0JHBsb3RfbHMKCmNhdCgiXG5cbiMjIE5vbi16ZXJvIFN0YWJpbGl0eSBTY29yZXMgUGVyIE1ldGhvZFxuXG4iKQp2dGhlbWVzOjpzdWJjaHVua2lmeSgKICBwbHRfbHNbWzFdXSwgaSA9IHNwcmludGYoIiVzLSVzIiwgZnBhdGgsIDEpLCAKICBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCAqIHJvdW5kKGxlbmd0aCh1bmlxdWUocmVzdWx0cyRmaSkpIC8gMiksIGZpZ193aWR0aCA9IGZpZ193aWR0aAopCgpjYXQoIlxuXG4jIyBTdGFiaWxpdHkgb2YgVG9wIEZlYXR1cmVzXG5cbiIpCnZ0aGVtZXM6OnN1YmNodW5raWZ5KAogIHBsb3RfZnVuKHBsdF9sc1tbMl1dKSwgaSA9IHNwcmludGYoIiVzLSVzIiwgZnBhdGgsIDIpLCAKICBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCwgZmlnX3dpZHRoID0gZmlnX3dpZHRoCikKCiMgZ2V0IHRvcCAxMCBnZW5lcwp0b3BfZ2VuZXMgPC0gcmFua2luZ19kZiAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoZmksIHZhcikgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShtZWFuX3JhbmsgPSBtZWFuKHJhbmspKSAlPiUKICBkcGx5cjo6dW5ncm91cCgpICU+JQogIGRwbHlyOjphcnJhbmdlKG1lYW5fcmFuaykgJT4lCiAgZHBseXI6Omdyb3VwX2J5KGZpKSAlPiUKICBkcGx5cjo6bXV0YXRlKHJhbmsgPSAxOmRwbHlyOjpuKCkpICU+JQogIGRwbHlyOjp1bmdyb3VwKCkKCnRvcF9nZW5lc190YWJsZSA8LSB0b3BfZ2VuZXMgJT4lCiAgZHBseXI6OmZpbHRlcihyYW5rIDw9IDEwKSAlPiUKICBkcGx5cjo6bGVmdF9qb2luKAogICAgeSA9IGRhdGEuZnJhbWUodmFyID0gMDoobmNvbChYKSAtIDEpLCAKICAgICAgICAgICAgICAgICAgIGdlbmUgPSBjb2xuYW1lcyhYKSksCiAgICBieSA9ICJ2YXIiCiAgKSAlPiUKICBkcGx5cjo6bXV0YXRlKAogICAgdmFsdWUgPSBzcHJpbnRmKCIlcyAoJXMpIiwgZ2VuZSwgcm91bmQobWVhbl9yYW5rLCAyKSkKICApICU+JQogIHRpZHlyOjpwaXZvdF93aWRlcigKICAgIGlkX2NvbHMgPSByYW5rLCAKICAgIG5hbWVzX2Zyb20gPSBmaSwgCiAgICB2YWx1ZXNfZnJvbSA9IHZhbHVlCiAgKSAlPiUKICBkcGx5cjo6cmVuYW1lKAogICAgIlJhbmsiID0gInJhbmsiCiAgKQoKIyB3cml0ZS5jc3YoCiMgICB0b3BfZ2VuZXNfdGFibGUsIGZpbGUucGF0aCh0YWJsZXNfZGlyLCAidGNnYV90b3BfZ2VuZXNfdGFibGUuY3N2IiksCiMgICByb3cubmFtZXMgPSBGQUxTRSwgcXVvdGUgPSBGQUxTRQojICkKCmNhdCgiXG5cbiMjIFRhYmxlIG9mIFRvcCBHZW5lcyBcblxuIikKaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICB0b3BfZ2VuZXNfa2FibGUgPC0gdG9wX2dlbmVzX3RhYmxlICU+JQogICAgdnRoZW1lczo6cHJldHR5X2thYmxlKGZvcm1hdCA9ICJsYXRleCIsIGxvbmd0YWJsZSA9IFRSVUUpICU+JQogICAga2FibGVFeHRyYTo6a2FibGVfc3R5bGluZyhsYXRleF9vcHRpb25zID0gInJlcGVhdF9oZWFkZXIiKQp9IGVsc2UgewogIHRvcF9nZW5lc19rYWJsZSA8LSB0b3BfZ2VuZXNfdGFibGUgJT4lCiAgICB2dGhlbWVzOjpwcmV0dHlfa2FibGUoKSAlPiUKICAgIGthYmxlRXh0cmE6OmthYmxlX3N0eWxpbmcobGF0ZXhfb3B0aW9ucyA9ICJyZXBlYXRfaGVhZGVyIikKICB2dGhlbWVzOjpzdWJjaHVua2lmeSgKICAgIHRvcF9nZW5lc19rYWJsZSwgaSA9IHNwcmludGYoIiVzLXRhYmxlIiwgZnBhdGgpCiAgKQp9CmBgYAoKCiMgTWlzc3BlY2lmaWVkIE1vZGVscyB7LnRhYnNldCAudGFic2V0LXZtb2Rlcm59CgpgYGB7ciBldmFsID0gVFJVRSwgcmVzdWx0cyA9ICJhc2lzIn0Ka2VlcF9tZXRob2RzIDwtIGNvbG9yX2RmJG5hbWUgJWluJSBjKCJHTURJX3JpZGdlX1JGIiwgIk1EQV9SRiIsICJNRElfUkYiLCAiTURJLW9vYl9SRiIsICJUcmVlU0hBUF9SRiIpCm1hbnVhbF9jb2xvcl9wYWxldHRlIDwtIGNvbG9yX2RmJGNvbG9yW2tlZXBfbWV0aG9kc10Kc2hvd19tZXRob2RzIDwtIGNvbG9yX2RmJG5hbWVba2VlcF9tZXRob2RzXQptZXRob2RfbGFiZWxzIDwtIGNvbG9yX2RmJGxhYmVsW2tlZXBfbWV0aG9kc10KYWxwaGFfdmFsdWVzIDwtIGMoMSwgcmVwKDAuNCwgbGVuZ3RoKG1ldGhvZF9sYWJlbHMpIC0gMSkpCmxlZ2VuZF9wb3NpdGlvbiA8LSBjKDAuNzMsIDAuMzUpCgp2YXJ5X3BhcmFtX25hbWUgPC0gImhlcml0YWJpbGl0eV9zYW1wbGVfcm93X24iCnlfbW9kZWxzIDwtIGMoImxpbmVhciIsICJsc3NfM21fMnIiLCAiaGllcl9wb2x5XzNtXzJyIiwgImxpbmVhcl9sc3NfM21fMnIiKQp4X21vZGVscyA8LSBjKCJlbmhhbmNlciIsICJjY2xlX3JuYXNlcSIsICJqdXZlbmlsZSIsICJzcGxpY2luZyIpCgpyZW1vdmVfeF9heGlzX21vZGVscyA8LSBjKCJlbmhhbmNlciIsICJjY2xlX3JuYXNlcSIsICJqdXZlbmlsZSIpCmtlZXBfbGVnZW5kX3hfbW9kZWxzIDwtIGMoImVuaGFuY2VyIikKa2VlcF9sZWdlbmRfeV9tb2RlbHMgPC0gYygibGluZWFyIiwgImxzc18zbV8yciIsICJoaWVyX3BvbHlfM21fMnIiLCAibGluZWFyX2xzc18zbV8yciIpCgpmb3IgKHlfbW9kZWwgaW4geV9tb2RlbHMpIHsKICBjYXQoc3ByaW50ZigiXG5cbiMjICVzIHsudGFic2V0IC50YWJzZXQtcGlsbHMgLnRhYnNldC1zcXVhcmV9XG5cbiIsIHlfbW9kZWwpKQogIGZvciAoeF9tb2RlbCBpbiB4X21vZGVscykgewogICAgY2F0KHNwcmludGYoIlxuXG4jIyMgJXMgXG5cbiIsIHhfbW9kZWwpKQogICAgcGx0X2xzIDwtIGxpc3QoKQogICAgc2ltX25hbWUgPC0gc3ByaW50ZigiJXNfJXNfZGdwX29taXR0ZWRfdmFycyIsIHhfbW9kZWwsIHlfbW9kZWwpCiAgICBzaW1fdGl0bGUgPC0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgeF9tb2RlbCA9PSAiY2NsZV9ybmFzZXEiIH4gIkNDTEUiLAogICAgICB4X21vZGVsID09ICJzcGxpY2luZyIgfiAiU3BsaWNpbmciLAogICAgICB4X21vZGVsID09ICJlbmhhbmNlciIgfiAiRW5oYW5jZXIiLAogICAgICB4X21vZGVsID09ICJqdXZlbmlsZSIgfiAiSnV2ZW5pbGUiCiAgICApCiAgICBtZXRyaWNfbmFtZSA8LSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICBtZXRyaWMgPT0gInJvY2F1YyIgfiAiQVVST0MiLAogICAgICBtZXRyaWMgPT0gInByYXVjIiB+ICJQUkFVQyIKICAgICkKICAgIGZuYW1lIDwtIGZpbGUucGF0aChyZXN1bHRzX2RpciwgcGFzdGUwKCJnbWRpLnJlZ3Jlc3Npb25fc2ltcy4iLCBzaW1fbmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJ2YXJ5aW5nXyIsIHZhcnlfcGFyYW1fbmFtZSksIAogICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgic2VlZCIsIHNlZWQpLCAicmVzdWx0cyIpCiAgICBpZiAoZmlsZS5leGlzdHMoc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKSAmIHBhcmFtcyR1c2VfY2FjaGVkKSB7CiAgICAgIHJlc3VsdHMgPC0gcmVhZFJEUyhzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgIGlmIChsZW5ndGgoc2V0ZGlmZihzaG93X21ldGhvZHMsIHVuaXF1ZShyZXN1bHRzJG1ldGhvZCkpKSA+IDApIHsKICAgICAgICByZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKHNwcmludGYoIiVzLmNzdiIsIGZuYW1lKSkgJT4lCiAgICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgICBzYXZlUkRTKHJlc3VsdHMsIHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChzcHJpbnRmKCIlcy5jc3YiLCBmbmFtZSkpICU+JQogICAgICAgIHJlZm9ybWF0X3Jlc3VsdHMoKQogICAgICBzYXZlUkRTKHJlc3VsdHMsIHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgIH0KICAgIGlmIChwYXJhbXMkZm9yX3BhcGVyKSB7CiAgICAgIGZvciAoaCBpbiBoZXJpdGFiaWxpdGllcykgewogICAgICAgIHBsdCA8LSByZXN1bHRzICU+JQogICAgICAgICAgZHBseXI6OmZpbHRlcihoZXJpdGFiaWxpdHkgPT0gISFoKSAlPiUKICAgICAgICAgIHBsb3RfbWV0cmljcygKICAgICAgICAgICAgbWV0cmljID0gbWV0cmljLAogICAgICAgICAgICB4X3N0ciA9ICJzYW1wbGVfcm93X24iLAogICAgICAgICAgICBmYWNldF9zdHIgPSBOVUxMLAogICAgICAgICAgICBwb2ludF9zaXplID0gcG9pbnRfc2l6ZSwKICAgICAgICAgICAgbGluZV9zaXplID0gbGluZV9zaXplLAogICAgICAgICAgICBlcnJiYXJfd2lkdGggPSBlcnJiYXJfd2lkdGgsCiAgICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICAgICAgICAgICAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgIGFscGhhX3ZhbHVlcyA9IGFscGhhX3ZhbHVlcywKICAgICAgICAgICAgbGVnZW5kX3Bvc2l0aW9uID0gbGVnZW5kX3Bvc2l0aW9uLAogICAgICAgICAgICBjdXN0b21fdGhlbWUgPSBjdXN0b21fdGhlbWUsCiAgICAgICAgICAgIGluc2lkZV9sZWdlbmQgPSBUUlVFCiAgICAgICAgICApICsKICAgICAgICAgIGdncGxvdDI6OmxhYnMoCiAgICAgICAgICAgIHggPSAiU2FtcGxlIFNpemUiLCB5ID0gbWV0cmljX25hbWUsIAogICAgICAgICAgICBjb2xvciA9ICJNZXRob2QiLCBhbHBoYSA9ICJNZXRob2QiCiAgICAgICAgICApCiAgICAgICAgaWYgKGggIT0gaGVyaXRhYmlsaXRpZXNbMV0pIHsKICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgfQogICAgICAgIGlmICh4X21vZGVsICVpbiUgcmVtb3ZlX3hfYXhpc19tb2RlbHMpIHsKICAgICAgICAgIGhlaWdodCA8LSAyLjcyCiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS54ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBoZWlnaHQgPC0gMwogICAgICAgIH0KICAgICAgICBpZiAoISgoaCA9PSBoZXJpdGFiaWxpdGllc1tsZW5ndGgoaGVyaXRhYmlsaXRpZXMpXSkgJiAKICAgICAgICAgICAgICAoeF9tb2RlbCAlaW4lIGtlZXBfbGVnZW5kX3hfbW9kZWxzKSAmIAogICAgICAgICAgICAgICh5X21vZGVsICVpbiUga2VlcF9sZWdlbmRfeV9tb2RlbHMpKSkgewogICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6Omd1aWRlcyhjb2xvciA9ICJub25lIiwgYWxwaGEgPSAibm9uZSIpCiAgICAgICAgfQogICAgICAgIHBsdF9sc1tbYXMuY2hhcmFjdGVyKGgpXV0gPC0gcGx0CiAgICAgIH0KICAgICAgcGx0IDwtIHBhdGNod29yazo6d3JhcF9wbG90cyhwbHRfbHMsIG5yb3cgPSAxKQogICAgICBnZ3Bsb3QyOjpnZ3NhdmUoCiAgICAgICAgZmlsZS5wYXRoKGZpZ3VyZXNfZGlyLCAibWlzc3BlY2lmaWVkX3JlZ3Jlc3Npb25fc2ltcyIsIAogICAgICAgICAgICAgICAgICBzcHJpbnRmKCJtaXNzcGVjaWZpZWRfcmVncmVzc2lvbl9zaW1zXyVzXyVzXyVzX2VycmJhcnMucGRmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICB5X21vZGVsLCB4X21vZGVsLCBtZXRyaWMpKSwKICAgICAgICBwbG90ID0gcGx0LCB1bml0cyA9ICJpbiIsIHdpZHRoID0gMTQsIGhlaWdodCA9IGhlaWdodAogICAgICApCiAgICB9IGVsc2UgewogICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICBwbG90X21ldHJpY3MoCiAgICAgICAgICBtZXRyaWMgPSBtZXRyaWMsCiAgICAgICAgICB4X3N0ciA9ICJzYW1wbGVfcm93X24iLAogICAgICAgICAgZmFjZXRfc3RyID0gImhlcml0YWJpbGl0eV9uYW1lIiwKICAgICAgICAgIHBvaW50X3NpemUgPSBwb2ludF9zaXplLAogICAgICAgICAgbGluZV9zaXplID0gbGluZV9zaXplLAogICAgICAgICAgZXJyYmFyX3dpZHRoID0gZXJyYmFyX3dpZHRoLAogICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICAgICAgICAgIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgYWxwaGFfdmFsdWVzID0gYWxwaGFfdmFsdWVzLAogICAgICAgICAgY3VzdG9tX3RoZW1lID0gY3VzdG9tX3RoZW1lCiAgICAgICAgKSArCiAgICAgICAgZ2dwbG90Mjo6bGFicygKICAgICAgICAgIHggPSAiU2FtcGxlIFNpemUiLCB5ID0gbWV0cmljX25hbWUsCiAgICAgICAgICBjb2xvciA9ICJNZXRob2QiLCBhbHBoYSA9ICJNZXRob2QiLAogICAgICAgICAgdGl0bGUgPSBzcHJpbnRmKCIlcyIsIHNpbV90aXRsZSkKICAgICAgICApCiAgICAgIHZ0aGVtZXM6OnN1YmNodW5raWZ5KHBsb3RfZnVuKHBsdCksIGkgPSBjaHVua19pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ19oZWlnaHQgPSBmaWdfaGVpZ2h0LCBmaWdfd2lkdGggPSBmaWdfd2lkdGggKiAxLjMpCiAgICAgIGNodW5rX2lkeCA8LSBjaHVua19pZHggKyAxCiAgICB9CiAgfQp9CgpgYGAKCgojIFZhcnlpbmcgU3BhcnNpdHkgey50YWJzZXQgLnRhYnNldC12bW9kZXJufQoKYGBge3IgZXZhbCA9IFRSVUUsIHJlc3VsdHMgPSAiYXNpcyJ9CmtlZXBfbWV0aG9kcyA8LSBjb2xvcl9kZiRuYW1lICVpbiUgYygiR01ESV9yaWRnZV9SRiIsICJNREFfUkYiLCAiTURJX1JGIiwgIk1ESS1vb2JfUkYiLCAiVHJlZVNIQVBfUkYiKQptYW51YWxfY29sb3JfcGFsZXR0ZSA8LSBjb2xvcl9kZiRjb2xvcltrZWVwX21ldGhvZHNdCnNob3dfbWV0aG9kcyA8LSBjb2xvcl9kZiRuYW1lW2tlZXBfbWV0aG9kc10KbWV0aG9kX2xhYmVscyA8LSBjb2xvcl9kZiRsYWJlbFtrZWVwX21ldGhvZHNdCmFscGhhX3ZhbHVlcyA8LSBjKDEsIHJlcCgwLjQsIGxlbmd0aChtZXRob2RfbGFiZWxzKSAtIDEpKQpsZWdlbmRfcG9zaXRpb24gPC0gYygwLjczLCAwLjcpCgp5X21vZGVscyA8LSBjKCJsaW5lYXIiLCAibHNzXzNtXzJyIiwgImhpZXJfcG9seV8zbV8yciIsICJsaW5lYXJfbHNzXzNtXzJyIikKeF9tb2RlbHMgPC0gYygianV2ZW5pbGUiLCAic3BsaWNpbmciKQoKcmVtb3ZlX3hfYXhpc19tb2RlbHMgPC0gYygic3BsaWNpbmciKQprZWVwX2xlZ2VuZF94X21vZGVscyA8LSBjKCJzcGxpY2luZyIpCmtlZXBfbGVnZW5kX3lfbW9kZWxzIDwtIGMoImxpbmVhciIsICJsaW5lYXJfbHNzXzNtXzJyIikKCmZvciAoeV9tb2RlbCBpbiB5X21vZGVscykgewogIGNhdChzcHJpbnRmKCJcblxuIyMgJXMgey50YWJzZXQgLnRhYnNldC1waWxscyAudGFic2V0LXNxdWFyZX1cblxuIiwgeV9tb2RlbCkpCiAgZm9yICh4X21vZGVsIGluIHhfbW9kZWxzKSB7CiAgICBjYXQoc3ByaW50ZigiXG5cbiMjIyAlcyBcblxuIiwgeF9tb2RlbCkpCiAgICBwbHRfbHMgPC0gbGlzdCgpCiAgICBzaW1fbmFtZSA8LSBzcHJpbnRmKCIlc18lc19kZ3AiLCB4X21vZGVsLCB5X21vZGVsKQogICAgc2ltX3RpdGxlIDwtIGRwbHlyOjpjYXNlX3doZW4oCiAgICAgIHhfbW9kZWwgPT0gImNjbGVfcm5hc2VxIiB+ICJDQ0xFIiwKICAgICAgeF9tb2RlbCA9PSAic3BsaWNpbmciIH4gIlNwbGljaW5nIiwKICAgICAgeF9tb2RlbCA9PSAiZW5oYW5jZXIiIH4gIkVuaGFuY2VyIiwKICAgICAgeF9tb2RlbCA9PSAianV2ZW5pbGUiIH4gIkp1dmVuaWxlIgogICAgKQogICAgbWV0cmljX25hbWUgPC0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgbWV0cmljID09ICJyb2NhdWMiIH4gIkFVUk9DIiwKICAgICAgbWV0cmljID09ICJwcmF1YyIgfiAiUFJBVUMiCiAgICApCiAgICB4X3N0ciA8LSBpZmVsc2UoeV9tb2RlbCA9PSAibGluZWFyIiwgInMiLCAibSIpCiAgICB2YXJ5X3BhcmFtX25hbWUgPC0gc3ByaW50ZigiaGVyaXRhYmlsaXR5XyVzIiwgeF9zdHIpCiAgICBmbmFtZSA8LSBmaWxlLnBhdGgocmVzdWx0c19kaXIsIHBhc3RlMCgiZ21kaS5vdGhlcl9yZWdyZXNzaW9uX3NpbXMudmFyeWluZ19zcGFyc2l0eS4iLCBzaW1fbmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJ2YXJ5aW5nXyIsIHZhcnlfcGFyYW1fbmFtZSksIAogICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgic2VlZCIsIHNlZWQpLCAicmVzdWx0cyIpCiAgICBpZiAoZmlsZS5leGlzdHMoc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKSAmIHBhcmFtcyR1c2VfY2FjaGVkKSB7CiAgICAgIHJlc3VsdHMgPC0gcmVhZFJEUyhzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgIGlmIChsZW5ndGgoc2V0ZGlmZihzaG93X21ldGhvZHMsIHVuaXF1ZShyZXN1bHRzJG1ldGhvZCkpKSA+IDApIHsKICAgICAgICByZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKHNwcmludGYoIiVzLmNzdiIsIGZuYW1lKSkgJT4lCiAgICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgICBzYXZlUkRTKHJlc3VsdHMsIHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChzcHJpbnRmKCIlcy5jc3YiLCBmbmFtZSkpICU+JQogICAgICAgIHJlZm9ybWF0X3Jlc3VsdHMoKQogICAgICBzYXZlUkRTKHJlc3VsdHMsIHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgIH0KICAgIGlmIChwYXJhbXMkZm9yX3BhcGVyKSB7CiAgICAgIGZvciAoaCBpbiBoZXJpdGFiaWxpdGllcykgewogICAgICAgIHBsdCA8LSByZXN1bHRzICU+JQogICAgICAgICAgZHBseXI6OmZpbHRlcihoZXJpdGFiaWxpdHkgPT0gISFoKSAlPiUKICAgICAgICAgIHBsb3RfbWV0cmljcygKICAgICAgICAgICAgbWV0cmljID0gbWV0cmljLAogICAgICAgICAgICB4X3N0ciA9IHhfc3RyLAogICAgICAgICAgICBmYWNldF9zdHIgPSBOVUxMLAogICAgICAgICAgICBwb2ludF9zaXplID0gcG9pbnRfc2l6ZSwKICAgICAgICAgICAgbGluZV9zaXplID0gbGluZV9zaXplLAogICAgICAgICAgICBlcnJiYXJfd2lkdGggPSBlcnJiYXJfd2lkdGgsCiAgICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICAgICAgICAgICAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgIGFscGhhX3ZhbHVlcyA9IGFscGhhX3ZhbHVlcywKICAgICAgICAgICAgbGVnZW5kX3Bvc2l0aW9uID0gbGVnZW5kX3Bvc2l0aW9uLAogICAgICAgICAgICBjdXN0b21fdGhlbWUgPSBjdXN0b21fdGhlbWUsCiAgICAgICAgICAgIGluc2lkZV9sZWdlbmQgPSBUUlVFCiAgICAgICAgICApICsKICAgICAgICAgIGdncGxvdDI6OmxhYnMoCiAgICAgICAgICAgIHggPSB0b3VwcGVyKHhfc3RyKSwgeSA9IG1ldHJpY19uYW1lLCAKICAgICAgICAgICAgY29sb3IgPSAiTWV0aG9kIiwgYWxwaGEgPSAiTWV0aG9kIgogICAgICAgICAgKQogICAgICAgIGlmIChoICE9IGhlcml0YWJpbGl0aWVzWzFdKSB7CiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgIH0KICAgICAgICBpZiAoeF9tb2RlbCAlaW4lIHJlbW92ZV94X2F4aXNfbW9kZWxzKSB7CiAgICAgICAgICBoZWlnaHQgPC0gMi43MgogICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueCA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSkKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaGVpZ2h0IDwtIDMKICAgICAgICB9CiAgICAgICAgaWYgKCEoKGggPT0gaGVyaXRhYmlsaXRpZXNbbGVuZ3RoKGhlcml0YWJpbGl0aWVzKV0pICYgCiAgICAgICAgICAgICAgKHhfbW9kZWwgJWluJSBrZWVwX2xlZ2VuZF94X21vZGVscykgJiAKICAgICAgICAgICAgICAoeV9tb2RlbCAlaW4lIGtlZXBfbGVnZW5kX3lfbW9kZWxzKSkpIHsKICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjpndWlkZXMoY29sb3IgPSAibm9uZSIsIGFscGhhID0gIm5vbmUiKQogICAgICAgIH0KICAgICAgICBwbHRfbHNbW2FzLmNoYXJhY3RlcihoKV1dIDwtIHBsdAogICAgICB9CiAgICAgIHBsdCA8LSBwYXRjaHdvcms6OndyYXBfcGxvdHMocGx0X2xzLCBucm93ID0gMSkKICAgICAgZ2dwbG90Mjo6Z2dzYXZlKAogICAgICAgIGZpbGUucGF0aChmaWd1cmVzX2RpciwgInZhcnlpbmdfc3BhcnNpdHkiLCAKICAgICAgICAgICAgICAgICAgc3ByaW50ZigicmVncmVzc2lvbl9zaW1zX3NwYXJzaXR5XyVzXyVzXyVzX2VycmJhcnMucGRmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICB5X21vZGVsLCB4X21vZGVsLCBtZXRyaWMpKSwKICAgICAgICBwbG90ID0gcGx0LCB1bml0cyA9ICJpbiIsIHdpZHRoID0gMTQsIGhlaWdodCA9IDMKICAgICAgKQogICAgfSBlbHNlIHsKICAgICAgcGx0IDwtIHJlc3VsdHMgJT4lCiAgICAgICAgcGxvdF9tZXRyaWNzKAogICAgICAgICAgbWV0cmljID0gbWV0cmljLAogICAgICAgICAgeF9zdHIgPSB4X3N0ciwKICAgICAgICAgIGZhY2V0X3N0ciA9ICJoZXJpdGFiaWxpdHlfbmFtZSIsCiAgICAgICAgICBwb2ludF9zaXplID0gcG9pbnRfc2l6ZSwKICAgICAgICAgIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwKICAgICAgICAgIGVycmJhcl93aWR0aCA9IGVycmJhcl93aWR0aCwKICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgICAgICAgICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgIGFscGhhX3ZhbHVlcyA9IGFscGhhX3ZhbHVlcywKICAgICAgICAgIGN1c3RvbV90aGVtZSA9IGN1c3RvbV90aGVtZQogICAgICAgICkgKwogICAgICAgIGdncGxvdDI6OmxhYnMoCiAgICAgICAgICB4ID0gdG91cHBlcih4X3N0ciksIHkgPSBtZXRyaWNfbmFtZSwKICAgICAgICAgIGNvbG9yID0gIk1ldGhvZCIsIGFscGhhID0gIk1ldGhvZCIsCiAgICAgICAgICB0aXRsZSA9IHNwcmludGYoIiVzIiwgc2ltX3RpdGxlKQogICAgICAgICkKICAgICAgdnRoZW1lczo6c3ViY2h1bmtpZnkocGxvdF9mdW4ocGx0KSwgaSA9IGNodW5rX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlnX2hlaWdodCA9IGZpZ19oZWlnaHQsIGZpZ193aWR0aCA9IGZpZ193aWR0aCAqIDEuMykKICAgICAgY2h1bmtfaWR4IDwtIGNodW5rX2lkeCArIDEKICAgIH0KICB9Cn0KCmBgYAoKCiMgVmFyeWluZyBcIyBGZWF0dXJlcyB7LnRhYnNldCAudGFic2V0LXZtb2Rlcm59CgpgYGB7ciBldmFsID0gVFJVRSwgcmVzdWx0cyA9ICJhc2lzIn0Ka2VlcF9tZXRob2RzIDwtIGNvbG9yX2RmJG5hbWUgJWluJSBjKCJHTURJX3JpZGdlX1JGIiwgIk1EQV9SRiIsICJNRElfUkYiLCAiTURJLW9vYl9SRiIsICJUcmVlU0hBUF9SRiIpCm1hbnVhbF9jb2xvcl9wYWxldHRlIDwtIGNvbG9yX2RmJGNvbG9yW2tlZXBfbWV0aG9kc10Kc2hvd19tZXRob2RzIDwtIGNvbG9yX2RmJG5hbWVba2VlcF9tZXRob2RzXQptZXRob2RfbGFiZWxzIDwtIGNvbG9yX2RmJGxhYmVsW2tlZXBfbWV0aG9kc10KYWxwaGFfdmFsdWVzIDwtIGMoMSwgcmVwKDAuNCwgbGVuZ3RoKG1ldGhvZF9sYWJlbHMpIC0gMSkpCmxlZ2VuZF9wb3NpdGlvbiA8LSBjKDAuNzMsIDAuNCkKCnZhcnlfcGFyYW1fbmFtZSA8LSAiaGVyaXRhYmlsaXR5X3NhbXBsZV9jb2xfbiIKeV9tb2RlbHMgPC0gYygibGluZWFyIiwgImxzc18zbV8yciIsICJoaWVyX3BvbHlfM21fMnIiLCAibGluZWFyX2xzc18zbV8yciIpCnhfbW9kZWxzIDwtIGMoImNjbGVfcm5hc2VxIikKCnJlbW92ZV94X2F4aXNfbW9kZWxzIDwtIGMoImxpbmVhciIsICJsc3NfM21fMnIiLCAiaGllcl9wb2x5XzNtXzJyIikKa2VlcF9sZWdlbmRfeF9tb2RlbHMgPC0gYygiY2NsZV9ybmFzZXEiKQprZWVwX2xlZ2VuZF95X21vZGVscyA8LSBjKCJsaW5lYXIiKQoKZm9yICh5X21vZGVsIGluIHlfbW9kZWxzKSB7CiAgY2F0KHNwcmludGYoIlxuXG4jIyAlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtc3F1YXJlfVxuXG4iLCB5X21vZGVsKSkKICBmb3IgKHhfbW9kZWwgaW4geF9tb2RlbHMpIHsKICAgIGNhdChzcHJpbnRmKCJcblxuIyMjICVzIFxuXG4iLCB4X21vZGVsKSkKICAgIHBsdF9scyA8LSBsaXN0KCkKICAgIHNpbV9uYW1lIDwtIHNwcmludGYoIiVzXyVzX2RncCIsIHhfbW9kZWwsIHlfbW9kZWwpCiAgICBzaW1fdGl0bGUgPC0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgeF9tb2RlbCA9PSAiY2NsZV9ybmFzZXEiIH4gIkNDTEUiLAogICAgICB4X21vZGVsID09ICJzcGxpY2luZyIgfiAiU3BsaWNpbmciLAogICAgICB4X21vZGVsID09ICJlbmhhbmNlciIgfiAiRW5oYW5jZXIiLAogICAgICB4X21vZGVsID09ICJqdXZlbmlsZSIgfiAiSnV2ZW5pbGUiCiAgICApCiAgICBtZXRyaWNfbmFtZSA8LSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICBtZXRyaWMgPT0gInJvY2F1YyIgfiAiQVVST0MiLAogICAgICBtZXRyaWMgPT0gInByYXVjIiB+ICJQUkFVQyIKICAgICkKICAgIGZuYW1lIDwtIGZpbGUucGF0aChyZXN1bHRzX2RpciwgcGFzdGUwKCJnbWRpLm90aGVyX3JlZ3Jlc3Npb25fc2ltcy52YXJ5aW5nX3AuIiwgc2ltX25hbWUpLAogICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgidmFyeWluZ18iLCB2YXJ5X3BhcmFtX25hbWUpLCAKICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInNlZWQiLCBzZWVkKSwgInJlc3VsdHMiKQogICAgaWYgKGZpbGUuZXhpc3RzKHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkgJiBwYXJhbXMkdXNlX2NhY2hlZCkgewogICAgICByZXN1bHRzIDwtIHJlYWRSRFMoc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgICBpZiAobGVuZ3RoKHNldGRpZmYoc2hvd19tZXRob2RzLCB1bmlxdWUocmVzdWx0cyRtZXRob2QpKSkgPiAwKSB7CiAgICAgICAgcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChzcHJpbnRmKCIlcy5jc3YiLCBmbmFtZSkpICU+JQogICAgICAgICAgcmVmb3JtYXRfcmVzdWx0cygpCiAgICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICB9CiAgICBpZiAocGFyYW1zJGZvcl9wYXBlcikgewogICAgICBmb3IgKGggaW4gaGVyaXRhYmlsaXRpZXMpIHsKICAgICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoaGVyaXRhYmlsaXR5ID09ICEhaCkgJT4lCiAgICAgICAgICBwbG90X21ldHJpY3MoCiAgICAgICAgICAgIG1ldHJpYyA9IG1ldHJpYywKICAgICAgICAgICAgeF9zdHIgPSAic2FtcGxlX2NvbF9uIiwKICAgICAgICAgICAgZmFjZXRfc3RyID0gTlVMTCwKICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IHBvaW50X3NpemUsCiAgICAgICAgICAgIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwKICAgICAgICAgICAgZXJyYmFyX3dpZHRoID0gZXJyYmFyX3dpZHRoLAogICAgICAgICAgICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICAgICAgICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgICAgICAgICAgIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICBhbHBoYV92YWx1ZXMgPSBhbHBoYV92YWx1ZXMsCiAgICAgICAgICAgIGxlZ2VuZF9wb3NpdGlvbiA9IGxlZ2VuZF9wb3NpdGlvbiwKICAgICAgICAgICAgY3VzdG9tX3RoZW1lID0gY3VzdG9tX3RoZW1lLAogICAgICAgICAgICBpbnNpZGVfbGVnZW5kID0gVFJVRQogICAgICAgICAgKSArCiAgICAgICAgICBnZ3Bsb3QyOjpsYWJzKAogICAgICAgICAgICB4ID0gIk51bWJlciBvZiBGZWF0dXJlcyIsIHkgPSBtZXRyaWNfbmFtZSwgCiAgICAgICAgICAgIGNvbG9yID0gIk1ldGhvZCIsIGFscGhhID0gIk1ldGhvZCIKICAgICAgICAgICkKICAgICAgICBpZiAoaCAhPSBoZXJpdGFiaWxpdGllc1sxXSkgewogICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSkKICAgICAgICB9CiAgICAgICAgaWYgKHlfbW9kZWwgJWluJSByZW1vdmVfeF9heGlzX21vZGVscykgewogICAgICAgICAgaGVpZ2h0IDwtIDIuNzIKICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnggPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGhlaWdodCA8LSAzCiAgICAgICAgfQogICAgICAgIGlmICghKChoID09IGhlcml0YWJpbGl0aWVzW2xlbmd0aChoZXJpdGFiaWxpdGllcyldKSAmIAogICAgICAgICAgICAgICh4X21vZGVsICVpbiUga2VlcF9sZWdlbmRfeF9tb2RlbHMpICYgCiAgICAgICAgICAgICAgKHlfbW9kZWwgJWluJSBrZWVwX2xlZ2VuZF95X21vZGVscykpKSB7CiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6Z3VpZGVzKGNvbG9yID0gIm5vbmUiLCBhbHBoYSA9ICJub25lIikKICAgICAgICB9CiAgICAgICAgcGx0X2xzW1thcy5jaGFyYWN0ZXIoaCldXSA8LSBwbHQKICAgICAgfQogICAgICBwbHQgPC0gcGF0Y2h3b3JrOjp3cmFwX3Bsb3RzKHBsdF9scywgbnJvdyA9IDEpCiAgICAgIGdncGxvdDI6Omdnc2F2ZSgKICAgICAgICBmaWxlLnBhdGgoZmlndXJlc19kaXIsICJ2YXJ5aW5nX3AiLCAKICAgICAgICAgICAgICAgICAgc3ByaW50ZigicmVncmVzc2lvbl9zaW1zX3ZhcnlfcF8lc18lc18lc19lcnJiYXJzLnBkZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgeV9tb2RlbCwgeF9tb2RlbCwgbWV0cmljKSksCiAgICAgICAgcGxvdCA9IHBsdCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDE0LCBoZWlnaHQgPSBoZWlnaHQKICAgICAgKQogICAgfSBlbHNlIHsKICAgICAgcGx0IDwtIHJlc3VsdHMgJT4lCiAgICAgICAgcGxvdF9tZXRyaWNzKAogICAgICAgICAgbWV0cmljID0gbWV0cmljLAogICAgICAgICAgeF9zdHIgPSAic2FtcGxlX2NvbF9uIiwKICAgICAgICAgIGZhY2V0X3N0ciA9ICJoZXJpdGFiaWxpdHlfbmFtZSIsCiAgICAgICAgICBwb2ludF9zaXplID0gcG9pbnRfc2l6ZSwKICAgICAgICAgIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwKICAgICAgICAgIGVycmJhcl93aWR0aCA9IGVycmJhcl93aWR0aCwKICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgICAgICAgICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgIGFscGhhX3ZhbHVlcyA9IGFscGhhX3ZhbHVlcywKICAgICAgICAgIGN1c3RvbV90aGVtZSA9IGN1c3RvbV90aGVtZQogICAgICAgICkgKwogICAgICAgIGdncGxvdDI6OmxhYnMoCiAgICAgICAgICB4ID0gIk51bWJlciBvZiBGZWF0dXJlcyIsIHkgPSBtZXRyaWNfbmFtZSwKICAgICAgICAgIGNvbG9yID0gIk1ldGhvZCIsIGFscGhhID0gIk1ldGhvZCIsCiAgICAgICAgICB0aXRsZSA9IHNwcmludGYoIiVzIiwgc2ltX3RpdGxlKQogICAgICAgICkKICAgICAgdnRoZW1lczo6c3ViY2h1bmtpZnkocGxvdF9mdW4ocGx0KSwgaSA9IGNodW5rX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlnX2hlaWdodCA9IGZpZ19oZWlnaHQsIGZpZ193aWR0aCA9IGZpZ193aWR0aCAqIDEuMykKICAgICAgY2h1bmtfaWR4IDwtIGNodW5rX2lkeCArIDEKICAgIH0KICB9Cn0KCmBgYAoKCiMgUHJlZGljdGlvbiBSZXN1bHRzIHsudGFic2V0IC50YWJzZXQtdm1vZGVybn0KCmBgYHtyIGV2YWwgPSBUUlVFLCByZXN1bHRzID0gImFzaXMifQpmcGF0aHMgPC0gYygKICAiZ21kaS5wcmVkaWN0aW9uX3NpbXMuY2NsZV9ybmFzZXFfcmVncmVzc2lvbi0iLAogICJnbWRpLnByZWRpY3Rpb25fc2ltcy5lbmhhbmNlcl9jbGFzc2lmaWNhdGlvbi0iLAogICJnbWRpLnByZWRpY3Rpb25fc2ltcy5zcGxpY2luZ19jbGFzc2lmaWNhdGlvbi0iLAogICJnbWRpLnByZWRpY3Rpb25fc2ltcy5qdXZlbmlsZV9jbGFzc2lmaWNhdGlvbi0iLAogICJnbWRpLnByZWRpY3Rpb25fc2ltcy50Y2dhX2JyY2FfY2xhc3NpZmljYXRpb24tIgopCgprZWVwX21vZGVscyA8LSBjKCJSRiIsICJSRi1yaWRnZSIsICJSRi1sYXNzbyIsICJSRi1sb2dpc3RpYyIpCnByZWRpY3Rpb25fbWV0cmljcyA8LSBjKAogICJyMiIsICJleHBsYWluZWRfdmFyaWFuY2UiLCAibWVhbl9zcXVhcmVkX2Vycm9yIiwgIm1lYW5fYWJzb2x1dGVfZXJyb3IiLAogICJyb2NhdWMiLCAicHJhdWMiLCAiYWNjdXJhY3kiLCAiZjEiLCAicmVjYWxsIiwgInByZWNpc2lvbiIsICJhdmdfcHJlY2lzaW9uIiwgImxvZ2xvc3MiCikKCnJlc3VsdHNfbHMgPC0gbGlzdCgpCmZvciAoZnBhdGggaW4gZnBhdGhzKSB7CiAgZm5hbWUgPC0gZmlsZS5wYXRoKAogICAgcmVzdWx0c19kaXIsIAogICAgZnBhdGgsCiAgICBzcHJpbnRmKCJzZWVkJXMiLCBzZWVkKSwKICAgICJyZXN1bHRzLmNzdiIKICApCiAgcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChmbmFtZSkgJT4lCiAgICByZWZvcm1hdF9yZXN1bHRzKHByZWRpY3Rpb24gPSBUUlVFKQogIAogIGlmICghKCJ5X3Rhc2siICVpbiUgY29sbmFtZXMocmVzdWx0cykpKSB7CiAgICByZXN1bHRzIDwtIHJlc3VsdHMgJT4lCiAgICAgIGRwbHlyOjptdXRhdGUoeV90YXNrID0gIlJlc3VsdHMiKQogIH0KICAKICBwbHRfZGYgPC0gcmVzdWx0cyAlPiUKICAgIHRpZHlyOjpwaXZvdF9sb25nZXIoCiAgICAgIGNvbHMgPSB0aWR5c2VsZWN0Ojphbnlfb2YocHJlZGljdGlvbl9tZXRyaWNzKSwgCiAgICAgIG5hbWVzX3RvID0gIm1ldHJpYyIsIHZhbHVlc190byA9ICJ2YWx1ZSIKICAgICkgJT4lIAogICAgZHBseXI6Omdyb3VwX2J5KHlfdGFzaywgbW9kZWwsIG1ldHJpYykgJT4lCiAgICBkcGx5cjo6c3VtbWFyaXNlKAogICAgICBtZWFuID0gbWVhbih2YWx1ZSksCiAgICAgIHNkID0gc2QodmFsdWUpLAogICAgICBuID0gZHBseXI6Om4oKQogICAgKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoCiAgICAgIHNlID0gc2QgLyBzcXJ0KG4pCiAgICApCiAgCiAgaWYgKGZwYXRoICE9ICJnbWRpLnByZWRpY3Rpb25fc2ltcy5jY2xlX3JuYXNlcV9yZWdyZXNzaW9uLSIpIHsKICAgIHJlc3VsdHNfbHNbW2ZwYXRoXV0gPC0gcGx0X2RmICU+JQogICAgICBkcGx5cjo6ZmlsdGVyKG1vZGVsICVpbiUgYygiUkYiLCAiUkYtbG9naXN0aWMiKSkgJT4lCiAgICAgIGRwbHlyOjpzZWxlY3QobW9kZWwsIG1ldHJpYywgbWVhbikgJT4lCiAgICAgIHRpZHlyOjpwaXZvdF93aWRlcihpZF9jb2xzID0gbWV0cmljLCBuYW1lc19mcm9tID0gIm1vZGVsIiwgdmFsdWVzX2Zyb20gPSAibWVhbiIpICU+JQogICAgICBkcGx5cjo6bXV0YXRlKGRpZmYgPSBgUkYtbG9naXN0aWNgIC0gUkYsCiAgICAgICAgICAgICAgICAgICAgcGVyY2VudF9kaWZmID0gKGBSRi1sb2dpc3RpY2AgLSBSRikgLyBhYnMoUkYpICogMTAwKQogIH0gZWxzZSB7CiAgICByZXN1bHRzX2xzW1tmcGF0aF1dIDwtIHBsdF9kZiAlPiUKICAgICAgZHBseXI6OmZpbHRlcihtb2RlbCAlaW4lIGMoIlJGIiwgIlJGLXJpZGdlIikpICU+JQogICAgICBkcGx5cjo6c2VsZWN0KHlfdGFzaywgbW9kZWwsIG1ldHJpYywgbWVhbikgJT4lCiAgICAgIHRpZHlyOjpwaXZvdF93aWRlcihpZF9jb2xzID0gYyh5X3Rhc2ssIG1ldHJpYyksIG5hbWVzX2Zyb20gPSAibW9kZWwiLCB2YWx1ZXNfZnJvbSA9ICJtZWFuIikgJT4lCiAgICAgIGRwbHlyOjptdXRhdGUoZGlmZiA9IGBSRi1yaWRnZWAgLSBSRiwKICAgICAgICAgICAgICAgICAgICBwZXJjZW50X2RpZmYgPSAoYFJGLXJpZGdlYCAtIFJGKSAvIGFicyhSRikgKiAxMDApCiAgfQp9CgpwbHRfcmVnIDwtIHJlc3VsdHNfbHMkYGdtZGkucHJlZGljdGlvbl9zaW1zLmNjbGVfcm5hc2VxX3JlZ3Jlc3Npb24tYCAlPiUKICBkcGx5cjo6ZmlsdGVyKG1ldHJpYyA9PSAicjIiKSAlPiUKICBkcGx5cjo6ZmlsdGVyKFJGID4gMC4xKSAlPiUKICBkcGx5cjo6bXV0YXRlKAogICAgbWV0cmljID0gaWZlbHNlKG1ldHJpYyA9PSAicjIiLCAiUi1zcXVhcmVkIiwgbWV0cmljKQogICkgJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KCkgKwogIGdncGxvdDI6OmFlcyh4ID0gUkYsIHkgPSBwZXJjZW50X2RpZmYsIGxhYmVsID0geV90YXNrKSArCiAgZ2dwbG90Mjo6bGFicyh4ID0gIlJGIFRlc3QgUi1zcXVhcmVkIiwgeSA9ICIlIENoYW5nZSBVc2luZyBSRisiKSArCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChzaXplID0gMykgKwogIGdncGxvdDI6Omdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZ3JlcGVsOjpnZW9tX2xhYmVsX3JlcGVsKGZpbGwgPSAid2hpdGUiKSArCiAgZ2dwbG90Mjo6ZmFjZXRfd3JhcCh+IG1ldHJpYywgc2NhbGVzID0gImZyZWUiKSArCiAgY3VzdG9tX3RoZW1lCgpwbHRfcmVnX2FsbCA8LSByZXN1bHRzX2xzJGBnbWRpLnByZWRpY3Rpb25fc2ltcy5jY2xlX3JuYXNlcV9yZWdyZXNzaW9uLWAgJT4lCiAgZHBseXI6OmZpbHRlcihtZXRyaWMgPT0gInIyIikgJT4lCiAgZHBseXI6Om11dGF0ZSgKICAgIG1ldHJpYyA9IGlmZWxzZShtZXRyaWMgPT0gInIyIiwgIlItc3F1YXJlZCIsIG1ldHJpYykKICApICU+JQogIGdncGxvdDI6OmdncGxvdCgpICsKICBnZ3Bsb3QyOjphZXMoeCA9IFJGLCB5ID0gcGVyY2VudF9kaWZmLCBsYWJlbCA9IHlfdGFzaykgKwogIGdncGxvdDI6OmxhYnMoeCA9ICJSRiBUZXN0IFItc3F1YXJlZCIsIHkgPSAiJSBDaGFuZ2UgVXNpbmcgUkYrIikgKwogIGdncGxvdDI6Omdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBnZ3Bsb3QyOjpnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2dyZXBlbDo6Z2VvbV9sYWJlbF9yZXBlbChmaWxsID0gIndoaXRlIikgKwogIGdncGxvdDI6OmZhY2V0X3dyYXAofiBtZXRyaWMsIHNjYWxlcyA9ICJmcmVlIikgKwogIGN1c3RvbV90aGVtZQoKaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICBnZ3Bsb3QyOjpnZ3NhdmUoCiAgICBwbG90ID0gcGx0X3JlZ19hbGwsIAogICAgZmlsZS5wYXRoKGZpZ3VyZXNfZGlyLCAicHJlZGljdGlvbl9yZXN1bHRzX2FwcGVuZGl4LnBkZiIpLAogICAgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDgsIGhlaWdodCA9IGhlaWdodCAqIDEuNQogICkKfQoKcGx0X2xzIDwtIGxpc3QocmVnID0gcGx0X3JlZykKZm9yIChtIGluIGMoImYxIiwgInByYXVjIikpIHsKICBwbHRfZGYgPC0gZHBseXI6OmJpbmRfcm93cyhyZXN1bHRzX2xzLCAuaWQgPSAiZGF0YXNldCIpICU+JQogICAgZHBseXI6OmZpbHRlcihtZXRyaWMgPT0gbSkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKAogICAgICBkYXRhc2V0ID0gc3RyaW5ncjo6c3RyX3JlbW92ZShkYXRhc2V0LCAiXmdtZGlcXC5wcmVkaWN0aW9uX3NpbXNcXC4iKSAlPiUKICAgICAgICBzdHJpbmdyOjpzdHJfcmVtb3ZlKCJfY2xhc3NpZmljYXRpb24tJCIpICU+JQogICAgICAgIHN0cmluZ3I6OnN0cl90b190aXRsZSgpICU+JQogICAgICAgIHN0cmluZ3I6OnN0cl9yZXBsYWNlKCJUY2dhX2JyY2EiLCAiVENHQSBCUkNBIiksCiAgICAgIGRpZmYgPSBpZmVsc2UobWV0cmljID09ICJsb2dsb3NzIiwgLWRpZmYsIGRpZmYpLAogICAgICBwZXJjZW50X2RpZmYgPSBpZmVsc2UobWV0cmljID09ICJsb2dsb3NzIiwgLXBlcmNlbnRfZGlmZiwgcGVyY2VudF9kaWZmKSwKICAgICAgbWV0cmljID0gZm9yY2F0czo6ZmN0X3JlY29kZShtZXRyaWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFjY3VyYWN5IiA9ICJhY2N1cmFjeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYxIiA9ICJmMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZ2F0aXZlIExvZy1sb3NzIiA9ICJsb2dsb3NzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVVQUkMiID0gInByYXVjIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVVST0MiID0gInJvY2F1YyIpCiAgICApCiAgcGx0X2xzW1ttXV0gPC0gcGx0X2RmICU+JQogICAgZ2dwbG90Mjo6Z2dwbG90KCkgKwogICAgZ2dwbG90Mjo6YWVzKHggPSBSRiwgeSA9IHBlcmNlbnRfZGlmZiwgbGFiZWwgPSBkYXRhc2V0KSArCiAgICBnZ3Bsb3QyOjpsYWJzKHggPSBzcHJpbnRmKCJSRiBUZXN0ICVzIiwgcGx0X2RmJG1ldHJpY1sxXSksIAogICAgICAgICAgICAgICAgICB5ID0gIiUgQ2hhbmdlIFVzaW5nIFJGKyIpICsKICAgIGdncGxvdDI6Omdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICAgIGdncGxvdDI6Omdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICAgIGdncmVwZWw6Omdlb21fbGFiZWxfcmVwZWwocG9pbnQucGFkZGluZyA9IDAuNSwgZmlsbCA9ICJ3aGl0ZSIpICsKICAgIGdncGxvdDI6OmZhY2V0X3dyYXAofiBtZXRyaWMsIHNjYWxlcyA9ICJmcmVlIiwgbnJvdyA9IDEpICsKICAgIGN1c3RvbV90aGVtZQp9CgpwbHRfbHNbWzNdXSA8LSBwbHRfbHNbWzNdXSArCiAgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQoKcGx0IDwtIHBsdF9sc1tbMV1dICsgcGF0Y2h3b3JrOjpwbG90X3NwYWNlcigpICsgcGx0X2xzW1syXV0gKyBwbHRfbHNbWzNdXSArCiAgcGF0Y2h3b3JrOjpwbG90X2xheW91dChucm93ID0gMSwgd2lkdGhzID0gYygxLCAwLjMsIDEsIDEpKQoKIyBwbHQKIyBncmlkOjpncmlkLmRyYXcoCiMgICBncmlkOjpsaW5lc0dyb2IoeCA9IGdyaWQ6OnVuaXQoYygwLjM2LCAwLjM2KSwgIm5wYyIpLAojICAgICAgICAgICAgICAgICAgIHkgPSBncmlkOjp1bml0KGMoMC4wNiwgMC45OCksICJucGMiKSkKIyApCiMgZ2dwbG90Mjo6Z2dzYXZlKAojICAgZmlsZS5wYXRoKGZpZ3VyZXNfZGlyLCAicHJlZGljdGlvbl9yZXN1bHRzX21haW4ucGRmIiksCiMgICB1bml0cyA9ICJpbiIsIHdpZHRoID0gMTQsIGhlaWdodCA9IGhlaWdodCAqIDEuNQojICkKCnZ0aGVtZXM6OnN1YmNodW5raWZ5KHBsdCwgaSA9IGNodW5rX2lkeCwKICAgICAgICAgICAgICAgICAgICAgZmlnX2hlaWdodCA9IGZpZ19oZWlnaHQsIGZpZ193aWR0aCA9IGZpZ193aWR0aCAqIDEuMykKY2h1bmtfaWR4IDwtIGNodW5rX2lkeCArIDEKYGBgCgoKIyBNREkrIEFkZC1vbnMgey50YWJzZXQgLnRhYnNldC12bW9kZXJufQoKYGBge3IgZXZhbCA9IFRSVUUsIHJlc3VsdHMgPSAiYXNpcyJ9Cm1hbnVhbF9jb2xvcl9wYWxldHRlIDwtIGMobWFudWFsX2NvbG9yX3BhbGV0dGVfY2hvaWNlc1ttZXRob2RfbGFiZWxzX2Nob2ljZXMgPT0gIk1ESSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlX2Nob2ljZXNbbWV0aG9kX2xhYmVsc19jaG9pY2VzID09ICJNREktb29iIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIiNBRjREOTgiLCAiI0ZGRDkyRiIsICIjRkM4RDYyIiwgImJsYWNrIikKc2hvd19tZXRob2RzIDwtIGMoIk1ESV9SRiIsICJNREktb29iX1JGIiwgIkdNRElfcmF3X1JGIiwgIkdNRElfbG9vX1JGIiwgIkdNRElfb2xzX3Jhd19sb29fUkYiLCAiR01ESV9yaWRnZV9yYXdfbG9vX1JGIikKbWV0aG9kX2xhYmVscyA8LSBjKCJNREkiLCAiTURJLW9vYiIsICJNREkrIChyYXcgb25seSkiLCAiTURJKyAobG9vIG9ubHkpIiwgIk1ESSsgKHJhdytsb28gb25seSkiLCAiTURJKyAocmlkZ2UrcmF3K2xvbykiKQphbHBoYV92YWx1ZXMgPC0gcmVwKDEsIGxlbmd0aChtZXRob2RfbGFiZWxzKSkKbGVnZW5kX3Bvc2l0aW9uIDwtIGMoMC42MywgMC40KQoKdmFyeV9wYXJhbV9uYW1lIDwtICJoZXJpdGFiaWxpdHlfc2FtcGxlX3Jvd19uIgp5X21vZGVscyA8LSBjKCJsaW5lYXIiLCAiaGllcl9wb2x5XzNtXzJyIikKeF9tb2RlbHMgPC0gYygiZW5oYW5jZXIiLCAiY2NsZV9ybmFzZXEiKSMsICJzcGxpY2luZyIpCm1pbl9zYW1wbGVzX3Blcl9sZWFmcyA8LSBjKDUsIDEpCgpyZW1vdmVfeF9heGlzX21vZGVscyA8LSBjKCJlbmhhbmNlciIpCmtlZXBfbGVnZW5kX3hfbW9kZWxzIDwtIGMoImVuaGFuY2VyIikKa2VlcF9sZWdlbmRfeV9tb2RlbHMgPC0gYygibGluZWFyIikKCmZvciAoeV9tb2RlbCBpbiB5X21vZGVscykgewogIGNhdChzcHJpbnRmKCJcblxuIyMgJXMgey50YWJzZXQgLnRhYnNldC1waWxscyAudGFic2V0LXNxdWFyZX1cblxuIiwgeV9tb2RlbCkpCiAgZm9yICh4X21vZGVsIGluIHhfbW9kZWxzKSB7CiAgICBjYXQoc3ByaW50ZigiXG5cbiMjIyAlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtY2lyY2xlfVxuXG4iLCB4X21vZGVsKSkKICAgIHBsdF9scyA8LSBsaXN0KCkKICAgIGZvciAobWluX3NhbXBsZXNfcGVyX2xlYWYgaW4gbWluX3NhbXBsZXNfcGVyX2xlYWZzKSB7CiAgICAgIGNhdChzcHJpbnRmKCJcblxuIyMjIyBtaW5fc2FtcGxlc19wZXJfbGVhZiA9ICVzIFxuXG4iLCBtaW5fc2FtcGxlc19wZXJfbGVhZikpCiAgICAgIHNpbV9uYW1lIDwtIHNwcmludGYoIiVzXyVzX2RncCIsIHhfbW9kZWwsIHlfbW9kZWwpCiAgICAgIHNpbV90aXRsZSA8LSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICAgIHhfbW9kZWwgPT0gImNjbGVfcm5hc2VxIiB+ICJDQ0xFIiwKICAgICAgICB4X21vZGVsID09ICJzcGxpY2luZyIgfiAiU3BsaWNpbmciLAogICAgICAgIHhfbW9kZWwgPT0gImVuaGFuY2VyIiB+ICJFbmhhbmNlciIsCiAgICAgICAgeF9tb2RlbCA9PSAianV2ZW5pbGUiIH4gIkp1dmVuaWxlIgogICAgICApCiAgICAgIG1ldHJpY19uYW1lIDwtIGRwbHlyOjpjYXNlX3doZW4oCiAgICAgICAgbWV0cmljID09ICJyb2NhdWMiIH4gIkFVUk9DIiwKICAgICAgICBtZXRyaWMgPT0gInByYXVjIiB+ICJQUkFVQyIKICAgICAgKQogICAgICBmbmFtZSA8LSBmaWxlLnBhdGgocmVzdWx0c19kaXIsIAogICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiZ21kaS5vdGhlcl9yZWdyZXNzaW9uX3NpbXMubW9kZWxpbmdfY2hvaWNlc19taW5fc2FtcGxlcyVzLiVzIiwgbWluX3NhbXBsZXNfcGVyX2xlYWYsIHNpbV9uYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgidmFyeWluZ18iLCB2YXJ5X3BhcmFtX25hbWUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgic2VlZCIsIHNlZWQpLCAicmVzdWx0cyIpCiAgICAgIGlmICghZmlsZS5leGlzdHMoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSkgewogICAgICAgIG5leHQKICAgICAgfQogICAgICBpZiAoZmlsZS5leGlzdHMoc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKSAmIHBhcmFtcyR1c2VfY2FjaGVkKSB7CiAgICAgICAgcmVzdWx0cyA8LSByZWFkUkRTKHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgICAgICBpZiAobGVuZ3RoKHNldGRpZmYoc2hvd19tZXRob2RzLCB1bmlxdWUocmVzdWx0cyRtZXRob2QpKSkgPiAwKSB7CiAgICAgICAgICByZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKHNwcmludGYoIiVzLmNzdiIsIGZuYW1lKSkgJT4lCiAgICAgICAgICAgIHJlZm9ybWF0X3Jlc3VsdHMoKQogICAgICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICAgIHJlZm9ybWF0X3Jlc3VsdHMoKQogICAgICAgIHNhdmVSRFMocmVzdWx0cywgc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgICB9CiAgICAgIGlmIChwYXJhbXMkZm9yX3BhcGVyKSB7CiAgICAgICAgZm9yIChoIGluIGhlcml0YWJpbGl0aWVzKSB7CiAgICAgICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICAgICAgZHBseXI6OmZpbHRlcihoZXJpdGFiaWxpdHkgPT0gISFoKSAlPiUKICAgICAgICAgICAgcGxvdF9tZXRyaWNzKAogICAgICAgICAgICAgIG1ldHJpYyA9IG1ldHJpYywKICAgICAgICAgICAgICB4X3N0ciA9ICJzYW1wbGVfcm93X24iLAogICAgICAgICAgICAgIGZhY2V0X3N0ciA9IE5VTEwsCiAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IHBvaW50X3NpemUsCiAgICAgICAgICAgICAgbGluZV9zaXplID0gbGluZV9zaXplLAogICAgICAgICAgICAgIGVycmJhcl93aWR0aCA9IGVycmJhcl93aWR0aCwKICAgICAgICAgICAgICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICAgICAgICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICAgICAgICAgICAgICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgICAgICBhbHBoYV92YWx1ZXMgPSBhbHBoYV92YWx1ZXMsCiAgICAgICAgICAgICAgbGVnZW5kX3Bvc2l0aW9uID0gbGVnZW5kX3Bvc2l0aW9uLAogICAgICAgICAgICAgIGN1c3RvbV90aGVtZSA9IGN1c3RvbV90aGVtZSwKICAgICAgICAgICAgICBpbnNpZGVfbGVnZW5kID0gVFJVRQogICAgICAgICAgICApICsKICAgICAgICAgICAgZ2dwbG90Mjo6bGFicygKICAgICAgICAgICAgICB4ID0gIlNhbXBsZSBTaXplIiwgeSA9IG1ldHJpY19uYW1lLCAKICAgICAgICAgICAgICBjb2xvciA9ICJNZXRob2QiLCBhbHBoYSA9ICJNZXRob2QiCiAgICAgICAgICAgICkgKwogICAgICAgICAgICBnZ3Bsb3QyOjp0aGVtZSgKICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTIpCiAgICAgICAgICAgICkKICAgICAgICAgIGlmIChoICE9IGhlcml0YWJpbGl0aWVzWzFdKSB7CiAgICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgICB9CiAgICAgICAgICBpZiAoeF9tb2RlbCAlaW4lIHJlbW92ZV94X2F4aXNfbW9kZWxzKSB7CiAgICAgICAgICAgIGhlaWdodCA8LSAyLjcyCiAgICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnggPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBoZWlnaHQgPC0gMwogICAgICAgICAgfQogICAgICAgICAgaWYgKCEoKGggPT0gaGVyaXRhYmlsaXRpZXNbbGVuZ3RoKGhlcml0YWJpbGl0aWVzKV0pICYgCiAgICAgICAgICAgICAgICAoeF9tb2RlbCAlaW4lIGtlZXBfbGVnZW5kX3hfbW9kZWxzKSAmIAogICAgICAgICAgICAgICAgKHlfbW9kZWwgJWluJSBrZWVwX2xlZ2VuZF95X21vZGVscykpKSB7CiAgICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjpndWlkZXMoY29sb3IgPSAibm9uZSIsIGFscGhhID0gIm5vbmUiKQogICAgICAgICAgfQogICAgICAgICAgcGx0X2xzW1thcy5jaGFyYWN0ZXIoaCldXSA8LSBwbHQKICAgICAgICB9CiAgICAgICAgcGx0IDwtIHBhdGNod29yazo6d3JhcF9wbG90cyhwbHRfbHMsIG5yb3cgPSAxKQogICAgICAgIGdncGxvdDI6Omdnc2F2ZSgKICAgICAgICAgIGZpbGUucGF0aChmaWd1cmVzX2RpciwgIm1vZGVsaW5nX2Nob2ljZXMiLAogICAgICAgICAgICAgICAgICAgIHNwcmludGYoInJlZ3Jlc3Npb25fc2ltc19jaG9pY2VzX21pbl9zYW1wbGVzJXNfJXNfJXNfJXNfZXJyYmFycy5wZGYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3NhbXBsZXNfcGVyX2xlYWYsIHlfbW9kZWwsIHhfbW9kZWwsIG1ldHJpYykpLAogICAgICAgICAgcGxvdCA9IHBsdCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDE0LCBoZWlnaHQgPSBoZWlnaHQKICAgICAgICApCiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGx0IDwtIHJlc3VsdHMgJT4lCiAgICAgICAgICBwbG90X21ldHJpY3MoCiAgICAgICAgICAgIG1ldHJpYyA9IG1ldHJpYywKICAgICAgICAgICAgeF9zdHIgPSAic2FtcGxlX3Jvd19uIiwKICAgICAgICAgICAgZmFjZXRfc3RyID0gImhlcml0YWJpbGl0eV9uYW1lIiwKICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IHBvaW50X3NpemUsCiAgICAgICAgICAgIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwKICAgICAgICAgICAgZXJyYmFyX3dpZHRoID0gZXJyYmFyX3dpZHRoLAogICAgICAgICAgICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICAgICAgICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgICAgICAgICAgIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICBhbHBoYV92YWx1ZXMgPSBhbHBoYV92YWx1ZXMsCiAgICAgICAgICAgIGN1c3RvbV90aGVtZSA9IGN1c3RvbV90aGVtZQogICAgICAgICAgKSArCiAgICAgICAgICBnZ3Bsb3QyOjpsYWJzKAogICAgICAgICAgICB4ID0gIlNhbXBsZSBTaXplIiwgeSA9IG1ldHJpY19uYW1lLAogICAgICAgICAgICBjb2xvciA9ICJNZXRob2QiLCBhbHBoYSA9ICJNZXRob2QiLAogICAgICAgICAgICB0aXRsZSA9IHNwcmludGYoIiVzIiwgc2ltX3RpdGxlKQogICAgICAgICAgKQogICAgICAgIHZ0aGVtZXM6OnN1YmNodW5raWZ5KHBsb3RfZnVuKHBsdCksIGkgPSBjaHVua19pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlnX2hlaWdodCA9IGZpZ19oZWlnaHQsIGZpZ193aWR0aCA9IGZpZ193aWR0aCAqIDEuMykKICAgICAgICBjaHVua19pZHggPC0gY2h1bmtfaWR4ICsgMQogICAgICB9CiAgICB9CiAgfQp9CgpgYGAKCgojIE1ESSsgR0xNL01ldHJpYyBDaG9pY2VzIHsudGFic2V0IC50YWJzZXQtdm1vZGVybn0KCiMjIEhlbGQtb3V0IFRlc3QgUHJlZGljdGlvbiBTY29yZXMgey50YWJzZXQgLnRhYnNldC1waWxscyAudGFic2V0LXNxdWFyZX0KCmBgYHtyIGV2YWwgPSBUUlVFLCByZXN1bHRzID0gImFzaXMifQptYW51YWxfY29sb3JfcGFsZXR0ZSA8LSBjKCIjQTVBRTlFIiwgImJsYWNrIiwgImJyb3duIikKc2hvd19tZXRob2RzIDwtIGMoIlJGIiwgIlJGLXJpZGdlIiwgIlJGLWxhc3NvIikKbWV0aG9kX2xhYmVscyA8LSBjKCJSRiIsICJSRityaWRnZSIsICJSRitsYXNzbyIpCmFscGhhX3ZhbHVlcyA8LSByZXAoMSwgbGVuZ3RoKG1ldGhvZF9sYWJlbHMpKQpsZWdlbmRfcG9zaXRpb24gPC0gYygwLjYzLCAwLjQpCgp2YXJ5X3BhcmFtX25hbWUgPC0gImhlcml0YWJpbGl0eV9zYW1wbGVfcm93X24iCnlfbW9kZWxzIDwtIGMoImxpbmVhciIsICJoaWVyX3BvbHlfM21fMnIiKQp4X21vZGVscyA8LSBjKCJlbmhhbmNlciIsICJjY2xlX3JuYXNlcSIpIywgInNwbGljaW5nIikKcHJlZGljdGlvbl9tZXRyaWNzIDwtIGMoCiAgInIyIiAjLCAibWVhbl9hYnNvbHV0ZV9lcnJvciIKICAjICJyb2NhdWMiLCAicHJhdWMiLCAiYWNjdXJhY3kiLCAiZjEiLCAicmVjYWxsIiwgInByZWNpc2lvbiIsICJhdmdfcHJlY2lzaW9uIiwgImxvZ2xvc3MiCikKCnJlbW92ZV94X2F4aXNfbW9kZWxzIDwtIGMoImVuaGFuY2VyIikKa2VlcF9sZWdlbmRfeF9tb2RlbHMgPC0gYygiZW5oYW5jZXIiKQprZWVwX2xlZ2VuZF95X21vZGVscyA8LSBjKCJsaW5lYXIiKQoKZm9yICh5X21vZGVsIGluIHlfbW9kZWxzKSB7CiAgY2F0KHNwcmludGYoIlxuXG4jIyMgJXMgey50YWJzZXQgLnRhYnNldC1waWxscyAudGFic2V0LXNxdWFyZX1cblxuIiwgeV9tb2RlbCkpCiAgZm9yICh4X21vZGVsIGluIHhfbW9kZWxzKSB7CiAgICBjYXQoc3ByaW50ZigiXG5cbiMjIyMgJXMgey50YWJzZXQgLnRhYnNldC1waWxscyAudGFic2V0LWNpcmNsZX1cblxuIiwgeF9tb2RlbCkpCiAgICBwbHRfbHMgPC0gbGlzdCgpCiAgICBzaW1fbmFtZSA8LSBzcHJpbnRmKCIlc18lc19kZ3AiLCB4X21vZGVsLCB5X21vZGVsKQogICAgc2ltX3RpdGxlIDwtIGRwbHlyOjpjYXNlX3doZW4oCiAgICAgIHhfbW9kZWwgPT0gImNjbGVfcm5hc2VxIiB+ICJDQ0xFIiwKICAgICAgeF9tb2RlbCA9PSAic3BsaWNpbmciIH4gIlNwbGljaW5nIiwKICAgICAgeF9tb2RlbCA9PSAiZW5oYW5jZXIiIH4gIkVuaGFuY2VyIiwKICAgICAgeF9tb2RlbCA9PSAianV2ZW5pbGUiIH4gIkp1dmVuaWxlIgogICAgKQogICAgZm5hbWUgPC0gZmlsZS5wYXRoKHJlc3VsdHNfZGlyLCAKICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCJnbWRpLmdsbV9tZXRyaWNfY2hvaWNlc19zaW1zLnJlZ3Jlc3Npb25fcHJlZGljdGlvbl9zaW1zLiVzIiwgc2ltX25hbWUpLAogICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgidmFyeWluZ18iLCB2YXJ5X3BhcmFtX25hbWUpLCAKICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInNlZWQiLCBzZWVkKSwgInJlc3VsdHMiKQogICAgaWYgKCFmaWxlLmV4aXN0cyhzcHJpbnRmKCIlcy5jc3YiLCBmbmFtZSkpKSB7CiAgICAgIG5leHQKICAgIH0KICAgIGlmIChmaWxlLmV4aXN0cyhzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpICYgcGFyYW1zJHVzZV9jYWNoZWQpIHsKICAgICAgcmVzdWx0cyA8LSByZWFkUkRTKHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgICAgaWYgKGxlbmd0aChzZXRkaWZmKHNob3dfbWV0aG9kcywgdW5pcXVlKHJlc3VsdHMkbWV0aG9kKSkpID4gMCkgewogICAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICAgIHJlZm9ybWF0X3Jlc3VsdHMocHJlZGljdGlvbiA9IFRSVUUpCiAgICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICByZWZvcm1hdF9yZXN1bHRzKHByZWRpY3Rpb24gPSBUUlVFKQogICAgICBzYXZlUkRTKHJlc3VsdHMsIHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgIH0KICAgIGZvciAobSBpbiBwcmVkaWN0aW9uX21ldHJpY3MpIHsKICAgICAgbWV0cmljX25hbWUgPC0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgICBtID09ICJyMiIgfiAiUi1zcXVhcmVkIiwKICAgICAgICBtID09ICJtYWUiIH4gIk1lYW4gQWJzb2x1dGUgRXJyb3IiCiAgICAgICkKICAgICAgaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICAgICAgICBmb3IgKGggaW4gaGVyaXRhYmlsaXRpZXMpIHsKICAgICAgICAgIHBsdCA8LSByZXN1bHRzICU+JQogICAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGhlcml0YWJpbGl0eSA9PSAhIWgpICU+JQogICAgICAgICAgICBwbG90X21ldHJpY3MoCiAgICAgICAgICAgICAgbWV0cmljID0gbSwKICAgICAgICAgICAgICB4X3N0ciA9ICJzYW1wbGVfcm93X24iLAogICAgICAgICAgICAgIGZhY2V0X3N0ciA9IE5VTEwsCiAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IHBvaW50X3NpemUsCiAgICAgICAgICAgICAgbGluZV9zaXplID0gbGluZV9zaXplLAogICAgICAgICAgICAgIGVycmJhcl93aWR0aCA9IGVycmJhcl93aWR0aCwKICAgICAgICAgICAgICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICAgICAgICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICAgICAgICAgICAgICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgICAgICBhbHBoYV92YWx1ZXMgPSBhbHBoYV92YWx1ZXMsCiAgICAgICAgICAgICAgbGVnZW5kX3Bvc2l0aW9uID0gbGVnZW5kX3Bvc2l0aW9uLAogICAgICAgICAgICAgIGN1c3RvbV90aGVtZSA9IGN1c3RvbV90aGVtZSwKICAgICAgICAgICAgICBpbnNpZGVfbGVnZW5kID0gVFJVRQogICAgICAgICAgICApICsKICAgICAgICAgICAgZ2dwbG90Mjo6bGFicygKICAgICAgICAgICAgICB4ID0gIlNhbXBsZSBTaXplIiwgeSA9IG1ldHJpY19uYW1lLCAKICAgICAgICAgICAgICBjb2xvciA9ICJNZXRob2QiLCBhbHBoYSA9ICJNZXRob2QiCiAgICAgICAgICAgICkgKwogICAgICAgICAgICBnZ3Bsb3QyOjp0aGVtZSgKICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTIpCiAgICAgICAgICAgICkKICAgICAgICAgIGlmIChoICE9IGhlcml0YWJpbGl0aWVzWzFdKSB7CiAgICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgICB9CiAgICAgICAgICBpZiAoeF9tb2RlbCAlaW4lIHJlbW92ZV94X2F4aXNfbW9kZWxzKSB7CiAgICAgICAgICAgIGhlaWdodCA8LSAyLjcyCiAgICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnggPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBoZWlnaHQgPC0gMwogICAgICAgICAgfQogICAgICAgICAgaWYgKCEoKGggPT0gaGVyaXRhYmlsaXRpZXNbbGVuZ3RoKGhlcml0YWJpbGl0aWVzKV0pICYgCiAgICAgICAgICAgICAgICAoeF9tb2RlbCAlaW4lIGtlZXBfbGVnZW5kX3hfbW9kZWxzKSAmIAogICAgICAgICAgICAgICAgKHlfbW9kZWwgJWluJSBrZWVwX2xlZ2VuZF95X21vZGVscykpKSB7CiAgICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjpndWlkZXMoY29sb3IgPSAibm9uZSIsIGFscGhhID0gIm5vbmUiKQogICAgICAgICAgfQogICAgICAgICAgcGx0X2xzW1thcy5jaGFyYWN0ZXIoaCldXSA8LSBwbHQKICAgICAgICB9CiAgICAgICAgcGx0IDwtIHBhdGNod29yazo6d3JhcF9wbG90cyhwbHRfbHMsIG5yb3cgPSAxKQogICAgICAgIGdncGxvdDI6Omdnc2F2ZSgKICAgICAgICAgIGZpbGUucGF0aChmaWd1cmVzX2RpciwgImdsbV9tZXRyaWNfY2hvaWNlcyIsCiAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigicmVncmVzc2lvbl9zaW1zX2dsbV9tZXRyaWNfY2hvaWNlc19wcmVkaWN0aW9uXyVzXyVzXyVzX2VycmJhcnMucGRmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlfbW9kZWwsIHhfbW9kZWwsIG0pKSwKICAgICAgICAgIHBsb3QgPSBwbHQsIHVuaXRzID0gImluIiwgd2lkdGggPSAxNCwgaGVpZ2h0ID0gaGVpZ2h0CiAgICAgICAgKQogICAgICB9IGVsc2UgewogICAgICAgIHBsdCA8LSByZXN1bHRzICU+JQogICAgICAgICAgcGxvdF9tZXRyaWNzKAogICAgICAgICAgICBtZXRyaWMgPSBtLAogICAgICAgICAgICB4X3N0ciA9ICJzYW1wbGVfcm93X24iLAogICAgICAgICAgICBmYWNldF9zdHIgPSAiaGVyaXRhYmlsaXR5X25hbWUiLAogICAgICAgICAgICBwb2ludF9zaXplID0gcG9pbnRfc2l6ZSwKICAgICAgICAgICAgbGluZV9zaXplID0gbGluZV9zaXplLAogICAgICAgICAgICBlcnJiYXJfd2lkdGggPSBlcnJiYXJfd2lkdGgsCiAgICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICAgICAgICAgICAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgIGFscGhhX3ZhbHVlcyA9IGFscGhhX3ZhbHVlcywKICAgICAgICAgICAgY3VzdG9tX3RoZW1lID0gY3VzdG9tX3RoZW1lCiAgICAgICAgICApICsKICAgICAgICAgIGdncGxvdDI6OmxhYnMoCiAgICAgICAgICAgIHggPSAiU2FtcGxlIFNpemUiLCB5ID0gbWV0cmljX25hbWUsCiAgICAgICAgICAgIGNvbG9yID0gIk1ldGhvZCIsIGFscGhhID0gIk1ldGhvZCIsCiAgICAgICAgICAgIHRpdGxlID0gc3ByaW50ZigiJXMiLCBzaW1fdGl0bGUpCiAgICAgICAgICApCiAgICAgICAgdnRoZW1lczo6c3ViY2h1bmtpZnkocGxvdF9mdW4ocGx0KSwgaSA9IGNodW5rX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCwgZmlnX3dpZHRoID0gZmlnX3dpZHRoICogMS4zKQogICAgICAgIGNodW5rX2lkeCA8LSBjaHVua19pZHggKyAxCiAgICAgIH0KICAgIH0KICB9Cn0KCmBgYAoKIyMgU3RhYmlsaXR5IFNjb3JlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtc3F1YXJlfQoKYGBge3IgZXZhbCA9IFRSVUUsIHJlc3VsdHMgPSAiYXNpcyJ9Cm1hbnVhbF9jb2xvcl9wYWxldHRlIDwtIGMoImJsYWNrIiwgImJsYWNrIiwgImJyb3duIiwgImJyb3duIiwgImdyYXkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGVfY2hvaWNlc1ttZXRob2RfbGFiZWxzX2Nob2ljZXMgPT0gIk1ESSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW51YWxfY29sb3JfcGFsZXR0ZV9jaG9pY2VzW21ldGhvZF9sYWJlbHNfY2hvaWNlcyA9PSAiTURJLW9vYiJdKQpzaG93X21ldGhvZHMgPC0gYygiR01ESV9yaWRnZV9yMl9SRiIsICJHTURJX3JpZGdlX25lZ19tYWVfUkYiLCAiR01ESV9sYXNzb19yMl9SRiIsICJHTURJX2xhc3NvX25lZ19tYWVfUkYiLCAiR01ESV9lbnNlbWJsZV9SRiIsICJNRElfUkYiLCAiTURJLW9vYl9SRiIpCm1ldGhvZF9sYWJlbHMgPC0gYygiTURJKyAocmlkZ2UsIHItc3F1YXJlZCkiLCAiTURJKyAocmlkZ2UsIE1BRSkiLCAiTURJKyAobGFzc28sIHItc3F1YXJlZCkiLCAiTURJKyAobGFzc28sIE1BRSkiLCAiTURJKyAoZW5zZW1ibGUpIiwgIk1ESSIsICJNREktb29iIikKbWFudWFsX2xpbmV0eXBlX3BhbGV0dGUgPC0gYygxLCAyLCAxLCAyLCAxLCAxLCAxKQphbHBoYV92YWx1ZXMgPC0gYyhyZXAoMSwgbGVuZ3RoKG1ldGhvZF9sYWJlbHMpIC0gMiksIHJlcCgwLjQsIDIpKQpsZWdlbmRfcG9zaXRpb24gPC0gYygwLjYzLCAwLjQpCgp2YXJ5X3BhcmFtX25hbWUgPC0gImhlcml0YWJpbGl0eV9zYW1wbGVfcm93X24iCiMgeV9tb2RlbHMgPC0gYygibGluZWFyIiwgImxzc18zbV8yciIsICJoaWVyX3BvbHlfM21fMnIiLCAibGluZWFyX2xzc18zbV8yciIpCiMgeF9tb2RlbHMgPC0gYygiZW5oYW5jZXIiLCAiY2NsZV9ybmFzZXEiLCAianV2ZW5pbGUiLCAic3BsaWNpbmciKQp5X21vZGVscyA8LSBjKCJsaW5lYXIiLCAiaGllcl9wb2x5XzNtXzJyIikKeF9tb2RlbHMgPC0gYygiZW5oYW5jZXIiLCAiY2NsZV9ybmFzZXEiKQojIHN0YWJpbGl0eV9tZXRyaWNzIDwtIGMoInRhdUFQIiwgIlJCTyIpCnN0YWJpbGl0eV9tZXRyaWNzIDwtIGMoIlJCTyIpCgpyZW1vdmVfeF9heGlzX21vZGVscyA8LSBtZXRyaWMKa2VlcF9sZWdlbmRfeF9tb2RlbHMgPC0geF9tb2RlbHMKa2VlcF9sZWdlbmRfeV9tb2RlbHMgPC0geV9tb2RlbHMKa2VlcF9sZWdlbmRfbWV0cmljcyA8LSBtZXRyaWMKCmZvciAoeV9tb2RlbCBpbiB5X21vZGVscykgewogIGNhdChzcHJpbnRmKCJcblxuIyMjICVzIHsudGFic2V0IC50YWJzZXQtcGlsbHMgLnRhYnNldC1zcXVhcmV9XG5cbiIsIHlfbW9kZWwpKQogIGZvciAoeF9tb2RlbCBpbiB4X21vZGVscykgewogICAgY2F0KHNwcmludGYoIlxuXG4jIyMjICVzIHsudGFic2V0IC50YWJzZXQtcGlsbHMgLnRhYnNldC1jaXJjbGV9XG5cbiIsIHhfbW9kZWwpKQogICAgc2ltX25hbWUgPC0gc3ByaW50ZigiJXNfJXNfZGdwIiwgeF9tb2RlbCwgeV9tb2RlbCkKICAgIHNpbV90aXRsZSA8LSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICB4X21vZGVsID09ICJjY2xlX3JuYXNlcSIgfiAiQ0NMRSIsCiAgICAgIHhfbW9kZWwgPT0gInNwbGljaW5nIiB+ICJTcGxpY2luZyIsCiAgICAgIHhfbW9kZWwgPT0gImVuaGFuY2VyIiB+ICJFbmhhbmNlciIsCiAgICAgIHhfbW9kZWwgPT0gImp1dmVuaWxlIiB+ICJKdXZlbmlsZSIKICAgICkKICAgIGZuYW1lIDwtIGZpbGUucGF0aChyZXN1bHRzX2RpciwgCiAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiZ21kaS5nbG1fbWV0cmljX2Nob2ljZXNfc2ltcy5yZWdyZXNzaW9uX3NpbXMuJXMiLCBzaW1fbmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJ2YXJ5aW5nXyIsIHZhcnlfcGFyYW1fbmFtZSksIAogICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgic2VlZCIsIHNlZWQpLCAicmVzdWx0cyIpCiAgICBpZiAoIWZpbGUuZXhpc3RzKHNwcmludGYoIiVzLmNzdiIsIGZuYW1lKSkpIHsKICAgICAgbmV4dAogICAgfQogICAgaWYgKGZpbGUuZXhpc3RzKHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkgJiBwYXJhbXMkdXNlX2NhY2hlZCkgewogICAgICByZXN1bHRzIDwtIHJlYWRSRFMoc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgICBpZiAobGVuZ3RoKHNldGRpZmYoc2hvd19tZXRob2RzLCB1bmlxdWUocmVzdWx0cyRtZXRob2QpKSkgPiAwKSB7CiAgICAgICAgcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChzcHJpbnRmKCIlcy5jc3YiLCBmbmFtZSkpICU+JQogICAgICAgICAgcmVmb3JtYXRfcmVzdWx0cygpCiAgICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICB9CiAgICBwbHRfbHMgPC0gbGlzdCgpCiAgICBmb3IgKG0gaW4gYyhtZXRyaWMsIHN0YWJpbGl0eV9tZXRyaWNzKSkgewogICAgICBtZXRyaWNfbmFtZSA8LSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICAgIG0gPT0gInJvY2F1YyIgfiAiQVVST0MiLAogICAgICAgIG0gPT0gInByYXVjIiB+ICJQUkFVQyIsCiAgICAgICAgVFJVRSB+IG0KICAgICAgKQogICAgICBpZiAocGFyYW1zJGZvcl9wYXBlcikgewogICAgICAgIGZvciAoaCBpbiBoZXJpdGFiaWxpdGllcykgewogICAgICAgICAgcGx0IDwtIHJlc3VsdHMgJT4lCiAgICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoaGVyaXRhYmlsaXR5ID09ICEhaCkgJT4lCiAgICAgICAgICAgIHBsb3RfbWV0cmljcygKICAgICAgICAgICAgICBtZXRyaWMgPSBtLAogICAgICAgICAgICAgIHhfc3RyID0gInNhbXBsZV9yb3dfbiIsCiAgICAgICAgICAgICAgZmFjZXRfc3RyID0gTlVMTCwKICAgICAgICAgICAgICBsaW5ldHlwZV9zdHIgPSAibWV0aG9kIiwKICAgICAgICAgICAgICBwb2ludF9zaXplID0gcG9pbnRfc2l6ZSwKICAgICAgICAgICAgICBsaW5lX3NpemUgPSBsaW5lX3NpemUsCiAgICAgICAgICAgICAgZXJyYmFyX3dpZHRoID0gZXJyYmFyX3dpZHRoLAogICAgICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICAgICAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogICAgICAgICAgICAgIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICAgIGFscGhhX3ZhbHVlcyA9IGFscGhhX3ZhbHVlcywKICAgICAgICAgICAgICBsZWdlbmRfcG9zaXRpb24gPSBsZWdlbmRfcG9zaXRpb24sCiAgICAgICAgICAgICAgY3VzdG9tX3RoZW1lID0gY3VzdG9tX3RoZW1lLAogICAgICAgICAgICAgIGluc2lkZV9sZWdlbmQgPSBGQUxTRQogICAgICAgICAgICApICsKICAgICAgICAgICAgZ2dwbG90Mjo6bGFicygKICAgICAgICAgICAgICB4ID0gIlNhbXBsZSBTaXplIiwgeSA9IG1ldHJpY19uYW1lLCAKICAgICAgICAgICAgICBjb2xvciA9ICJNZXRob2QiLCBhbHBoYSA9ICJNZXRob2QiLCBsaW5ldHlwZSA9ICJNZXRob2QiCiAgICAgICAgICAgICkgKwogICAgICAgICAgICBnZ3Bsb3QyOjpzY2FsZV9saW5ldHlwZV9tYW51YWwoCiAgICAgICAgICAgICAgdmFsdWVzID0gbWFudWFsX2xpbmV0eXBlX3BhbGV0dGUsIGxhYmVscyA9IG1ldGhvZF9sYWJlbHMKICAgICAgICAgICAgKSArCiAgICAgICAgICAgIGdncGxvdDI6OnRoZW1lKAogICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgICAgICAgbGVnZW5kLmtleS53aWR0aCA9IGdncGxvdDI6OnVuaXQoMS45LCAiY20iKQogICAgICAgICAgICApCiAgICAgICAgICBpZiAoaCAhPSBoZXJpdGFiaWxpdGllc1sxXSkgewogICAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgICAgfQogICAgICAgICAgaWYgKG0gJWluJSByZW1vdmVfeF9heGlzX21vZGVscykgewogICAgICAgICAgICBoZWlnaHQgPC0gMi43MgogICAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS54ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaGVpZ2h0IDwtIDMKICAgICAgICAgIH0KICAgICAgICAgIGlmICghKChoID09IGhlcml0YWJpbGl0aWVzW2xlbmd0aChoZXJpdGFiaWxpdGllcyldKSAmIAogICAgICAgICAgICAgICAgKHhfbW9kZWwgJWluJSBrZWVwX2xlZ2VuZF94X21vZGVscykgJiAKICAgICAgICAgICAgICAgICh5X21vZGVsICVpbiUga2VlcF9sZWdlbmRfeV9tb2RlbHMpICYKICAgICAgICAgICAgICAgIChtZXRyaWMgJWluJSBrZWVwX2xlZ2VuZF9tZXRyaWNzKSkpIHsKICAgICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6Omd1aWRlcyhjb2xvciA9ICJub25lIiwgYWxwaGEgPSAibm9uZSIsIGxpbmV0eXBlID0gIm5vbmUiKQogICAgICAgICAgfQogICAgICAgICAgcGx0X2xzW1tzcHJpbnRmKCIlc18lcyIsIGFzLmNoYXJhY3RlcihoKSwgbSldXSA8LSBwbHQKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGx0IDwtIHJlc3VsdHMgJT4lCiAgICAgICAgICBwbG90X21ldHJpY3MoCiAgICAgICAgICAgIG1ldHJpYyA9IG0sCiAgICAgICAgICAgIHhfc3RyID0gInNhbXBsZV9yb3dfbiIsCiAgICAgICAgICAgIGZhY2V0X3N0ciA9ICJoZXJpdGFiaWxpdHlfbmFtZSIsCiAgICAgICAgICAgIGxpbmV0eXBlX3N0ciA9ICJtZXRob2QiLAogICAgICAgICAgICBwb2ludF9zaXplID0gcG9pbnRfc2l6ZSwKICAgICAgICAgICAgbGluZV9zaXplID0gbGluZV9zaXplLAogICAgICAgICAgICBlcnJiYXJfd2lkdGggPSBlcnJiYXJfd2lkdGgsCiAgICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICAgICAgICAgICAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgIGFscGhhX3ZhbHVlcyA9IGFscGhhX3ZhbHVlcywKICAgICAgICAgICAgY3VzdG9tX3RoZW1lID0gY3VzdG9tX3RoZW1lCiAgICAgICAgICApICsKICAgICAgICAgIGdncGxvdDI6OmxhYnMoCiAgICAgICAgICAgIHggPSAiU2FtcGxlIFNpemUiLCB5ID0gbWV0cmljX25hbWUsCiAgICAgICAgICAgIGNvbG9yID0gIk1ldGhvZCIsIGFscGhhID0gIk1ldGhvZCIsIGxpbmV0eXBlID0gIk1ldGhvZCIsCiAgICAgICAgICAgIHRpdGxlID0gc3ByaW50ZigiJXMiLCBzaW1fdGl0bGUpCiAgICAgICAgICApICsKICAgICAgICAgIGdncGxvdDI6OnNjYWxlX2xpbmV0eXBlX21hbnVhbCgKICAgICAgICAgICAgdmFsdWVzID0gbWFudWFsX2xpbmV0eXBlX3BhbGV0dGUsIGxhYmVscyA9IG1ldGhvZF9sYWJlbHMKICAgICAgICAgICkgKwogICAgICAgICAgZ2dwbG90Mjo6dGhlbWUoCiAgICAgICAgICAgIGxlZ2VuZC5rZXkud2lkdGggPSBnZ3Bsb3QyOjp1bml0KDEuOSwgImNtIikKICAgICAgICAgICkKICAgICAgICB2dGhlbWVzOjpzdWJjaHVua2lmeShwbG90X2Z1bihwbHQpLCBpID0gY2h1bmtfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ19oZWlnaHQgPSBmaWdfaGVpZ2h0LCBmaWdfd2lkdGggPSBmaWdfd2lkdGggKiAxLjUpCiAgICAgICAgY2h1bmtfaWR4IDwtIGNodW5rX2lkeCArIDEKICAgICAgfQogICAgfQogICAgaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICAgICAgbnJvd3MgPC0gbGVuZ3RoKGMobWV0cmljLCBzdGFiaWxpdHlfbWV0cmljcykpCiAgICAgIHBsdCA8LSBwYXRjaHdvcms6OndyYXBfcGxvdHMocGx0X2xzLCBucm93ID0gbnJvd3MsIGd1aWRlcyA9ICJjb2xsZWN0IikKICAgICAgZ2dwbG90Mjo6Z2dzYXZlKAogICAgICAgIGZpbGUucGF0aChmaWd1cmVzX2RpciwgImdsbV9tZXRyaWNfY2hvaWNlcyIsCiAgICAgICAgICAgICAgICAgIHNwcmludGYoInJlZ3Jlc3Npb25fc2ltc19nbG1fbWV0cmljX2Nob2ljZXNfc3RhYmlsaXR5XyVzXyVzX2VycmJhcnMucGRmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICB5X21vZGVsLCB4X21vZGVsKSksCiAgICAgICAgcGxvdCA9IHBsdCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDE0ICogMS4yLCBoZWlnaHQgPSBoZWlnaHQgKiBucm93cwogICAgICApCiAgICB9CiAgfQp9CgpgYGAKCiMjIFN0YWJpbGl0eSBTY29yZXMgLSBDbGFzc2lmaWNhdGlvbiB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtc3F1YXJlfQoKYGBge3IgZXZhbCA9IFRSVUUsIHJlc3VsdHMgPSAiYXNpcyJ9Cm1hbnVhbF9jb2xvcl9wYWxldHRlIDwtIGMoIiM5QjVERkYiLCAiIzlCNURGRiIsICJibGFjayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlX2Nob2ljZXNbbWV0aG9kX2xhYmVsc19jaG9pY2VzID09ICJNREkiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGVfY2hvaWNlc1ttZXRob2RfbGFiZWxzX2Nob2ljZXMgPT0gIk1ESS1vb2IiXSkKc2hvd19tZXRob2RzIDwtIGMoIkdNRElfbG9naXN0aWNfcmlkZ2VfbG9nbG9zc19SRiIsICJHTURJX2xvZ2lzdGljX3JpZGdlX2F1cm9jX1JGIiwgIkdNRElfcmlkZ2VfcjJfUkYiLCAiTURJX1JGIiwgIk1ESS1vb2JfUkYiKQptZXRob2RfbGFiZWxzIDwtIGMoIk1ESSsgKGxvZ2lzdGljLCBsb2ctbG9zcykiLCAiTURJKyAobG9naXN0aWMsIEFVUk9DKSIsICJNREkrIChyaWRnZSwgci1zcXVhcmVkKSIsICJNREkiLCAiTURJLW9vYiIpCm1hbnVhbF9saW5ldHlwZV9wYWxldHRlIDwtIGMoMSwgMiwgMSwgMSwgMSkKYWxwaGFfdmFsdWVzIDwtIGMocmVwKDEsIGxlbmd0aChtZXRob2RfbGFiZWxzKSAtIDIpLCByZXAoMC40LCAyKSkKbGVnZW5kX3Bvc2l0aW9uIDwtIGMoMC42MywgMC40KQoKdmFyeV9wYXJhbV9uYW1lIDwtICJmcmFjX2xhYmVsX2NvcnJ1cHRpb25fc2FtcGxlX3Jvd19uIgojIHlfbW9kZWxzIDwtIGMoImxvZ2lzdGljIiwgImxzc18zbV8ycl9sb2dpc3RpYyIsICJoaWVyX3BvbHlfM21fMnJfbG9naXN0aWMiLCAibGluZWFyX2xzc18zbV8ycl9sb2dpc3RpYyIpCiMgeF9tb2RlbHMgPC0gYygiZW5oYW5jZXIiLCAiY2NsZV9ybmFzZXEiLCAianV2ZW5pbGUiLCAic3BsaWNpbmciKQp5X21vZGVscyA8LSBjKCJsb2dpc3RpYyIsICJoaWVyX3BvbHlfM21fMnJfbG9naXN0aWMiKQp4X21vZGVscyA8LSBjKCJqdXZlbmlsZSIsICJzcGxpY2luZyIpCiMgc3RhYmlsaXR5X21ldHJpY3MgPC0gYygidGF1QVAiLCAiUkJPIikKc3RhYmlsaXR5X21ldHJpY3MgPC0gIlJCTyIKCnJlbW92ZV94X2F4aXNfbW9kZWxzIDwtIG1ldHJpYwprZWVwX2xlZ2VuZF94X21vZGVscyA8LSB4X21vZGVscwprZWVwX2xlZ2VuZF95X21vZGVscyA8LSB5X21vZGVscwprZWVwX2xlZ2VuZF9tZXRyaWNzIDwtIG1ldHJpYwoKZm9yICh5X21vZGVsIGluIHlfbW9kZWxzKSB7CiAgY2F0KHNwcmludGYoIlxuXG4jIyMgJXMgey50YWJzZXQgLnRhYnNldC1waWxscyAudGFic2V0LXNxdWFyZX1cblxuIiwgeV9tb2RlbCkpCiAgZm9yICh4X21vZGVsIGluIHhfbW9kZWxzKSB7CiAgICBjYXQoc3ByaW50ZigiXG5cbiMjIyMgJXMgey50YWJzZXQgLnRhYnNldC1waWxscyAudGFic2V0LWNpcmNsZX1cblxuIiwgeF9tb2RlbCkpCiAgICBzaW1fbmFtZSA8LSBzcHJpbnRmKCIlc18lc19kZ3AiLCB4X21vZGVsLCB5X21vZGVsKQogICAgc2ltX3RpdGxlIDwtIGRwbHlyOjpjYXNlX3doZW4oCiAgICAgIHhfbW9kZWwgPT0gImNjbGVfcm5hc2VxIiB+ICJDQ0xFIiwKICAgICAgeF9tb2RlbCA9PSAic3BsaWNpbmciIH4gIlNwbGljaW5nIiwKICAgICAgeF9tb2RlbCA9PSAiZW5oYW5jZXIiIH4gIkVuaGFuY2VyIiwKICAgICAgeF9tb2RlbCA9PSAianV2ZW5pbGUiIH4gIkp1dmVuaWxlIgogICAgKQogICAgZm5hbWUgPC0gZmlsZS5wYXRoKHJlc3VsdHNfZGlyLCAKICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCJnbWRpLmdsbV9tZXRyaWNfY2hvaWNlc19zaW1zLmNsYXNzaWZpY2F0aW9uX3NpbXMuJXMiLCBzaW1fbmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJ2YXJ5aW5nXyIsIHZhcnlfcGFyYW1fbmFtZSksIAogICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgic2VlZCIsIHNlZWQpLCAicmVzdWx0cyIpCiAgICBpZiAoIWZpbGUuZXhpc3RzKHNwcmludGYoIiVzLmNzdiIsIGZuYW1lKSkpIHsKICAgICAgbmV4dAogICAgfQogICAgaWYgKGZpbGUuZXhpc3RzKHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkgJiBwYXJhbXMkdXNlX2NhY2hlZCkgewogICAgICByZXN1bHRzIDwtIHJlYWRSRFMoc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgICBpZiAobGVuZ3RoKHNldGRpZmYoc2hvd19tZXRob2RzLCB1bmlxdWUocmVzdWx0cyRtZXRob2QpKSkgPiAwKSB7CiAgICAgICAgcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChzcHJpbnRmKCIlcy5jc3YiLCBmbmFtZSkpICU+JQogICAgICAgICAgcmVmb3JtYXRfcmVzdWx0cygpCiAgICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICB9CiAgICBwbHRfbHMgPC0gbGlzdCgpCiAgICBmb3IgKG0gaW4gYyhtZXRyaWMsIHN0YWJpbGl0eV9tZXRyaWNzKSkgewogICAgICBtZXRyaWNfbmFtZSA8LSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICAgIG0gPT0gInJvY2F1YyIgfiAiQVVST0MiLAogICAgICAgIG0gPT0gInByYXVjIiB+ICJQUkFVQyIsCiAgICAgICAgVFJVRSB+IG0KICAgICAgKQogICAgICBpZiAocGFyYW1zJGZvcl9wYXBlcikgewogICAgICAgIGZvciAoaCBpbiBmcmFjX2xhYmVsX2NvcnJ1cHRpb25zKSB7CiAgICAgICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICAgICAgZHBseXI6OmZpbHRlcihmcmFjX2xhYmVsX2NvcnJ1cHRpb25fbmFtZSA9PSAhIWgpICU+JQogICAgICAgICAgICBwbG90X21ldHJpY3MoCiAgICAgICAgICAgICAgbWV0cmljID0gbSwKICAgICAgICAgICAgICB4X3N0ciA9ICJzYW1wbGVfcm93X24iLAogICAgICAgICAgICAgIGZhY2V0X3N0ciA9IE5VTEwsCiAgICAgICAgICAgICAgbGluZXR5cGVfc3RyID0gIm1ldGhvZCIsCiAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IHBvaW50X3NpemUsCiAgICAgICAgICAgICAgbGluZV9zaXplID0gbGluZV9zaXplLAogICAgICAgICAgICAgIGVycmJhcl93aWR0aCA9IGVycmJhcl93aWR0aCwKICAgICAgICAgICAgICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICAgICAgICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICAgICAgICAgICAgICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgICAgICBhbHBoYV92YWx1ZXMgPSBhbHBoYV92YWx1ZXMsCiAgICAgICAgICAgICAgbGVnZW5kX3Bvc2l0aW9uID0gbGVnZW5kX3Bvc2l0aW9uLAogICAgICAgICAgICAgIGN1c3RvbV90aGVtZSA9IGN1c3RvbV90aGVtZSwKICAgICAgICAgICAgICBpbnNpZGVfbGVnZW5kID0gRkFMU0UKICAgICAgICAgICAgKSArCiAgICAgICAgICAgIGdncGxvdDI6OmxhYnMoCiAgICAgICAgICAgICAgeCA9ICJTYW1wbGUgU2l6ZSIsIHkgPSBtZXRyaWNfbmFtZSwgCiAgICAgICAgICAgICAgY29sb3IgPSAiTWV0aG9kIiwgYWxwaGEgPSAiTWV0aG9kIiwgbGluZXR5cGUgPSAiTWV0aG9kIgogICAgICAgICAgICApICsKICAgICAgICAgICAgZ2dwbG90Mjo6c2NhbGVfbGluZXR5cGVfbWFudWFsKAogICAgICAgICAgICAgIHZhbHVlcyA9IG1hbnVhbF9saW5ldHlwZV9wYWxldHRlLCBsYWJlbHMgPSBtZXRob2RfbGFiZWxzCiAgICAgICAgICAgICkgKwogICAgICAgICAgICBnZ3Bsb3QyOjp0aGVtZSgKICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICAgICAgIGxlZ2VuZC5rZXkud2lkdGggPSBnZ3Bsb3QyOjp1bml0KDEuOSwgImNtIikKICAgICAgICAgICAgKQogICAgICAgICAgaWYgKGggIT0gZnJhY19sYWJlbF9jb3JydXB0aW9uc1sxXSkgewogICAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgICAgfQogICAgICAgICAgaWYgKG0gJWluJSByZW1vdmVfeF9heGlzX21vZGVscykgewogICAgICAgICAgICBoZWlnaHQgPC0gMi43MgogICAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS54ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaGVpZ2h0IDwtIDMKICAgICAgICAgIH0KICAgICAgICAgIGlmICghKChoID09IGZyYWNfbGFiZWxfY29ycnVwdGlvbnNbbGVuZ3RoKGZyYWNfbGFiZWxfY29ycnVwdGlvbnMpXSkgJiAKICAgICAgICAgICAgICAgICh4X21vZGVsICVpbiUga2VlcF9sZWdlbmRfeF9tb2RlbHMpICYgCiAgICAgICAgICAgICAgICAoeV9tb2RlbCAlaW4lIGtlZXBfbGVnZW5kX3lfbW9kZWxzKSAmCiAgICAgICAgICAgICAgICAobWV0cmljICVpbiUga2VlcF9sZWdlbmRfbWV0cmljcykpKSB7CiAgICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjpndWlkZXMoY29sb3IgPSAibm9uZSIsIGFscGhhID0gIm5vbmUiLCBsaW5ldHlwZSA9ICJub25lIikKICAgICAgICAgIH0KICAgICAgICAgIHBsdF9sc1tbc3ByaW50ZigiJXNfJXMiLCBhcy5jaGFyYWN0ZXIoaCksIG0pXV0gPC0gcGx0CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHBsdCA8LSByZXN1bHRzICU+JQogICAgICAgICAgcGxvdF9tZXRyaWNzKAogICAgICAgICAgICBtZXRyaWMgPSBtLAogICAgICAgICAgICB4X3N0ciA9ICJzYW1wbGVfcm93X24iLAogICAgICAgICAgICBmYWNldF9zdHIgPSAiZnJhY19sYWJlbF9jb3JydXB0aW9uX25hbWUiLAogICAgICAgICAgICBsaW5ldHlwZV9zdHIgPSAibWV0aG9kIiwKICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IHBvaW50X3NpemUsCiAgICAgICAgICAgIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwKICAgICAgICAgICAgZXJyYmFyX3dpZHRoID0gZXJyYmFyX3dpZHRoLAogICAgICAgICAgICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICAgICAgICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgICAgICAgICAgIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICBhbHBoYV92YWx1ZXMgPSBhbHBoYV92YWx1ZXMsCiAgICAgICAgICAgIGN1c3RvbV90aGVtZSA9IGN1c3RvbV90aGVtZQogICAgICAgICAgKSArCiAgICAgICAgICBnZ3Bsb3QyOjpsYWJzKAogICAgICAgICAgICB4ID0gIlNhbXBsZSBTaXplIiwgeSA9IG1ldHJpY19uYW1lLAogICAgICAgICAgICBjb2xvciA9ICJNZXRob2QiLCBhbHBoYSA9ICJNZXRob2QiLCBsaW5ldHlwZSA9ICJNZXRob2QiLAogICAgICAgICAgICB0aXRsZSA9IHNwcmludGYoIiVzIiwgc2ltX3RpdGxlKQogICAgICAgICAgKSArCiAgICAgICAgICBnZ3Bsb3QyOjpzY2FsZV9saW5ldHlwZV9tYW51YWwoCiAgICAgICAgICAgIHZhbHVlcyA9IG1hbnVhbF9saW5ldHlwZV9wYWxldHRlLCBsYWJlbHMgPSBtZXRob2RfbGFiZWxzCiAgICAgICAgICApICsKICAgICAgICAgIGdncGxvdDI6OnRoZW1lKAogICAgICAgICAgICBsZWdlbmQua2V5LndpZHRoID0gZ2dwbG90Mjo6dW5pdCgxLjksICJjbSIpCiAgICAgICAgICApCiAgICAgICAgdnRoZW1lczo6c3ViY2h1bmtpZnkocGxvdF9mdW4ocGx0KSwgaSA9IGNodW5rX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCwgZmlnX3dpZHRoID0gZmlnX3dpZHRoICogMS41KQogICAgICAgIGNodW5rX2lkeCA8LSBjaHVua19pZHggKyAxCiAgICAgIH0KICAgIH0KICAgIGlmIChwYXJhbXMkZm9yX3BhcGVyKSB7CiAgICAgIG5yb3dzIDwtIGxlbmd0aChjKG1ldHJpYywgc3RhYmlsaXR5X21ldHJpY3MpKQogICAgICBwbHQgPC0gcGF0Y2h3b3JrOjp3cmFwX3Bsb3RzKHBsdF9scywgbnJvdyA9IG5yb3dzLCBndWlkZXMgPSAiY29sbGVjdCIpCiAgICAgIGdncGxvdDI6Omdnc2F2ZSgKICAgICAgICBmaWxlLnBhdGgoZmlndXJlc19kaXIsICJnbG1fbWV0cmljX2Nob2ljZXMiLAogICAgICAgICAgICAgICAgICBzcHJpbnRmKCJjbGFzc2lmaWNhdGlvbl9zaW1zX2dsbV9tZXRyaWNfY2hvaWNlc19zdGFiaWxpdHlfJXNfJXNfZXJyYmFycy5wZGYiLAogICAgICAgICAgICAgICAgICAgICAgICAgIHlfbW9kZWwsIHhfbW9kZWwpKSwKICAgICAgICBwbG90ID0gcGx0LCB1bml0cyA9ICJpbiIsIHdpZHRoID0gMTQgKiAxLjIsIGhlaWdodCA9IGhlaWdodCAqIG5yb3dzCiAgICAgICkKICAgIH0KICB9Cn0KCmBgYAo=